2012-04-07 70 views
28

Ho un numero di oggetti Customer memorizzati in ArrayList. La mia classe Customer ha 2 membri dati: Name e Email. Ora voglio modificare solo lo Email per il cliente "Doe".ArrayList - Come modificare un membro di un oggetto?

Ora, se "Doe" si trova a 3 di indice nella lista, so che posso scrivere questa linea:

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

Ma questo significa che la creazione di un nuovo oggetto. Se ho una lista molto grande, suppongo che il processo sarebbe molto lento. Esiste un altro modo per accedere direttamente al membro dati di un oggetto archiviato in un ArrayList, magari utilizzando un altro tipo di raccolta rispetto a ArrayList?

risposta

3

Supponendo Customer ha un setter per la posta elettronica - myList.get(3).setEmail("[email protected]")

2

Usa myList.get(3) per ottenere l'accesso all'oggetto corrente e modificarlo, assumendo le istanze di Customer hanno un modo di essere modificato.

36

Si può fare questo:

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

Hai appena può fare andare avanti la raccolta poi basta modificare gli attributi del cliente che hai appena fatto un 'ottenere' su. Non v'è alcuna necessità di modificare l'insieme né v'è la necessità di creare un nuovo cliente:

int currentCustomer = 3; 

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

Se avete bisogno di velocemente di ricerca (tempo sostanzialmente costante) di un oggetto memorizzato nella vostra collezione si dovrebbe usare mappa al posto di Lista .

Se è necessaria una iterazione rapida degli oggetti, è necessario utilizzare Elenco.

Quindi nel tuo 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

ti ho scritto 2 classi per mostrare come si fa; Principale e Cliente. Se si esegue la classe principale che si vede quello che sta succedendo:

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"); 
    } 

} 

per ottenere questo correre, fare 2 classi, e cliente principale e copiare incollare il contenuto di entrambe le classi alla classe corretta; quindi eseguire la classe principale.

1

È possibile scorrere l'array per identificare l'indice e infine l'oggetto che è necessario modificare. È possibile utilizzare for-each per lo stesso, come di seguito:

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

Ecco cliente è un riferimento all'oggetto presente in Arraylist, se si modifica qualsiasi proprietà di questo riferimento del cliente, questi cambiamenti si riflettono nel vostro oggetto memorizzato in Lista di array.

+0

Questo non NPE salvare. -> "Doe" .equals (customer.getName()), BTW: Perché non ti fermi dopo la prima partita? –

+0

grazie per la correzione .. entrambi i punti sono buoni da tenere a mente. – Mahendra

0

Bene, hai usato Pojo Entity così puoi farlo. è necessario ottenere l'oggetto e impostare i dati.

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

così puoi farlo. o puoi anche impostare altri parametri.

0

Prova questo. Questo funziona mentre si attraversa il codice e si modificano i campi in una sola volta di tutti gli elementi di 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

Risolto. Ho sbagliato: questo si applica solo alla riassegnazione degli elementi. Pensavo che l'oggetto restituito non stesse riferendosi a quello nuovo.

Può essere fatto.

Q: Perché?
A: Il metodo get() restituisce un oggetto che fa riferimento a quello originale.

Quindi, se si scrive myArrayList.get(15).itsVariable = 7
o
myArrayList.get(15).myMethod("My Value"),
in realtà si sta assegnando un valore/utilizzando un metodo dall'oggetto riferimento da quello restituito (questo significa, la modifica viene applicata all'oggetto originale)

L'unica cosa che non si può fare è myArrayList.get(15) = myNewElement. Per fare questo devi usare il metodo list.set().

+4

Questo non è corretto. È vero che [ArrayList.get()] (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get (int)) restituisce una copia dell'elemento ma nel caso in cui l'elemento sia un oggetto (come sarebbe per la domanda Elenco di autori ), restituisce una copia del riferimento all'oggetto. Qualsiasi modifica apportata a questo riferimento si rifletterà nell'elenco poiché il riferimento punta esattamente nello stesso luogo in memoria dell'oggetto nella lista. Quindi: 'myList.get (3) .setEmail (" [email protected] ");' modifica il Cliente alla posizione 3 nella mail della lista. –

+0

@Antoine Dahan ha ragione. Questa risposta non è corretta per gli oggetti. Si prega di modificarlo o rimuoverlo. –

0

Senza funzione qui è ... funziona bene con listArrays pieni di oggetti

esempio `

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, .... 
      } 
Problemi correlati