2012-04-07 26 views
28

Tengo un número de objetos Customer almacenados en una ArrayList. Mi clase Customer tiene 2 miembros de datos: Name y Email. Ahora quiero modificar solo el Email para "Doe" del cliente.ArrayList - ¿Cómo modificar un miembro de un objeto?

Ahora bien, si "Doe" se encuentra en el índice 3 en la lista, sé que puedo escribir esta línea:

myList.set(3, new Customer("Doe", "[email protected]")); 

Pero eso significa que la creación de un nuevo objeto. Si tengo una lista muy grande, supongo que el proceso sería muy lento. ¿Hay alguna otra manera de acceder directamente al miembro de datos de un Objeto almacenado en una ArrayList, tal vez usando otro tipo de Colección que ArrayList?

Respuesta

3

Suponiendo Customer tiene un regulador para el correo electrónico - myList.get(3).setEmail("[email protected]")

2

Uso myList.get(3) para obtener acceso al objeto actual y modificarlo, suponiendo que las instancias de Customer haber una manera de ser modificado.

36

Usted puede hacer esto:

myList.get(3).setEmail("new email"); 
1

Sólo puede hacer llegar a la colección, entonces basta con modificar los atributos del cliente que acaba de hacer un 'get' en. No hay necesidad de modificar la colección ni existe la necesidad de crear un nuevo cliente:

int currentCustomer = 3; 

// get the customer at 3 
Customer c = list.get(currentCustomer); 
// change his email 
c.setEmail("[email protected]"); 
0

Si necesita búsqueda rápida (tiempo básicamente constante) de un objeto almacenado en su colección se debe utilizar Mapa lugar de la lista .

Si necesita una iteración rápida de los objetos, debe usar List.

Así, en su caso ...

Map<String,Customer> customers = new HashMap<String,Customer>(); 

//somewhere in the code you fill up the Map, assuming customer names are unique 
customers.put(customer.getName(), customer) 

// at some later point you retrieve it like this; 
// this is fast, given a good hash 
// been calculated for the "keys" in your map, in this case the keys are unique 
// String objects so the default hash algorithm should be fine 
Customer theCustomerYouLookFor = customers.get("Doe"); 

// modify it 
theCustomerYouLookFor.setEmail("[email protected]") 
3

Te escribí 2 clases para mostrarle cómo se hace; Principal y Cliente. Si ejecuta la clase principal que vea lo que está pasando:

import java.util.*; 

public class Customer { 

    private String name; 
    private String email; 

    public Customer(String name, String email) { 
     this.name = name; 
     this.email = email; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Override 
    public String toString() { 
     return name + " | " + email; 
    } 

    public static String toString(Collection<Customer> customers) { 
     String s = ""; 
     for(Customer customer : customers) { 
      s += customer + "\n"; 
     } 
     return s; 
    } 

} 


import java.util.*; 

public class Main { 

    public static void main(String[] args) { 
     List<Customer> customers = new ArrayList<>(); 
     customers.add(new Customer("Bert", "[email protected]")); 
     customers.add(new Customer("Ernie", "[email protected]")); 
     System.out.println("customers before email change - start"); 
     System.out.println(Customer.toString(customers)); 
     System.out.println("end"); 
     customers.get(1).setEmail("[email protected]"); 
     System.out.println("customers after email change - start"); 
     System.out.println(Customer.toString(customers)); 
     System.out.println("end"); 
    } 

} 

para obtener esta corriente, no se 2 clases, principal y de atención al cliente y copiar pegar el contenido de ambas clases a la clase correcta; luego ejecuta la clase Principal.

1

Puede iterar a través de la lista de arrays para identificar el índice y eventualmente el objeto que necesita modificar. Se puede utilizar para-cada uno para la misma de la siguiente manera:

for(Customer customer : myList) { 
    if(customer!=null && "Doe".equals(customer.getName())) { 
     customer.setEmail("[email protected]"); 
     break; 
    } 
} 

Aquí cliente es una referencia al objeto presente en Arraylist, si cambia la propiedad de esta referencia del cliente, estos cambios se reflejan en su objeto almacenado en Lista de arreglo.

+0

Esto no NPE guardar. -> "Doe" .equals (customer.getName()), BTW: ¿Por qué no te paras después del primer partido? –

+0

gracias por corregir ... ambos puntos son buenos para tener en cuenta. – Mahendra

0

Bien has usado Pojo Entity para que puedas hacer esto. u necesita obtener el objeto de eso y tener que establecer datos.

myList.get(3).setEmail("email"); 

de esa manera puede hacerlo. o puedes configurar otros parámetros también.

0

Pruebe esto. Esto funciona al atravesar el código y modificar los campos a la vez de todos los elementos de Arraylist.

public Employee(String name,String email){ 
this.name=name; 
this.email=email; 
} 

public void setName(String name) { 
this.name = name; 
} 

public String getName() { 
return name; 
} 

public void setEmail(String email) { 
this.email = email; 
} 

public String getEmail() { 
return email; 
} 

for(int i=0;i++){ 
List.get(i).setName("Anonymous"); 
List.get(i).setEmail("[email protected]"); 
} 
6

Fijo. Estaba equivocado: esto solo se aplica a la reasignación de elementos. Pensé que el objeto devuelto no hacía referencia al nuevo.

Se puede hacer.

Q: ¿Por qué?
A: El método get() devuelve un objeto que hace referencia al original.

Por lo tanto, si se escribe myArrayList.get(15).itsVariable = 7
o
myArrayList.get(15).myMethod("My Value"),
en realidad se está asignando un valor/usando un método del objeto referencia por el vuelto uno (esto quiere decir, el cambio se aplica al objeto original)

La única cosa que no se puede hacer esmyArrayList.get(15) = myNewElement. Para hacer esto, debes usar el método list.set().

+4

Esto no es correcto. Es cierto que [ArrayList.get()] (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get (int)) devuelve una copia del elemento pero en el caso de que el elemento sea un objeto (como lo sería para la lista del autor de la pregunta ), devuelve una copia de la referencia al objeto. Cualquier modificación que haga a esta referencia se reflejará en la lista porque la referencia apunta exactamente al mismo lugar en la memoria que el objeto en la lista. Entonces esto: 'myList.get (3) .setEmail (" [email protected] ");' modificaría al Cliente en la posición 3 en el correo electrónico de la lista. –

+0

@Antoine Dahan tiene razón. Esta respuesta no es correcta para los objetos. Por favor modifíquelo o quítelo. –

0

sin función aquí es ... que trabaja muy bien con listArrays llenas de objetos

ejemplo `

al.add(new Student(101,"Jack",23,'C'));//adding Student class object 
     al.add(new Student(102,"Evan",21,'A')); 
     al.add(new Student(103,"Berton",25,'B')); 
     al.add(0, new Student(104,"Brian",20,'D')); 
     al.add(0, new Student(105,"Lance",24,'D')); 
     for(int i = 101; i< 101+al.size(); i++) { 
       al.get(i-101).rollno = i;//rollno is 101, 102 , 103, .... 
      } 
Cuestiones relacionadas