2012-05-08 13 views
5

Ho un ArrayList che contiene alcuni oggetti, ad esempio User e ogni oggetto ha una proprietà name e password. Come posso cancellare solo l'oggetto User che ha un "nome" specifico da questo ArrayList?Come rimuovere un oggetto da un ArrayList in Java?

+3

Puoi essere più preciso nel descrivere la tua domanda? scrivi uno snippet del codice su cui stai lavorando ... – aleroot

risposta

1

Basta cercare nell'elenco Array degli oggetti che si ottengono dall'utente e verificare un nome uguale al nome che si desidera rimuovere. Quindi rimuovi l'oggetto dall'elenco.

+0

Si spera che ci siano ottimizzazioni che possono essere fatte, altrimenti l'OP è bloccato con un'implementazione O (n). –

+1

@ X-Zero In quale scenario in cui non si conosce la posizione di un oggetto in una lista, si può avere di meglio di 'O (n)'? –

+2

@ X-Zero: se tutti gli OP hanno una lista di array, allora 'O (n)' è il meglio che può sperare (la rimozione degli elementi da sola è 'O (n)'). – NPE

2

Si potrebbe:

  • loop all'interno di una lista con un iteratore
  • verifica se ogni elemento nella lista è il diritto utente (controllando il nome)
  • se lo è, utilizzare il metodo remove dell'iteratore.
21
Iterator<User> it = list.iterator(); 
while (it.hasNext()) { 
    User user = it.next(); 
    if (user.getName().equals("John Doe")) { 
    it.remove(); 
    } 
} 
+9

Non sembra che l'OP abbia funzionato per questa domanda, non dovresti dare loro il codice gratuitamente. –

+0

Cosa rappresenta la lista ????? –

+1

Sì Sì Ho capito ... grazie –

0

Il codice potrebbe essere simile a questo:

List<User> users = new ArrayList<User>(); 

public void removeUser(String name){ 
    for(User user:users){ 
     if(user.name.equals(name)){ 
      users.remove(user); 
     } 
    } 
} 
+2

È necessario utilizzare un iteratore per rimuovere all'interno di un ciclo o si otterrà probabilmente un ConcurrentModificationException. – assylias

+0

@assylias Il ciclo di base per esteso è stato esteso in Java 5 per rendere più conveniente l'iterazione su array e altre raccolte. E l'implicità del ciclo per ogni usa l'iteratore –

+1

Prova ad eseguire questo codice (mi dispiace per la formattazione): 'Lista list = new ArrayList (); list.add ("a"); per (Stringa: lista) { list.remove (s); } e dovresti ottenere un'eccezione. – assylias

4

Un altro pensiero: Se la classe utente può essere definita in modo univoco dal nome utente, e se si ignora è uguale con qualcosa di simile:

public booleano uguale (oggetto arg0) {

return this.name.equals(((user) arg0).name); 
} 

È possibile rimuovere l'utente senza scorrere l'elenco. Si può solo fare:

list.remove (nuovo utente ("John Doe"))

5

Siete probabilmente affrontati alla ConcurrentModificationException durante il tentativo di rimuovere l'oggetto dal List. Una spiegazione per questa eccezione è che l'iteratore di ArrayList è un iteratore fail-fast. Ad esempio, genera un'eccezione (errore) quando rileva che la sua raccolta nel runtime è stata modificata. La soluzione a questo problema è utilizzare Iterator.

Ecco un semplice esempio che dimostrano come si potrebbe scorrere l'List e rimuovere l'elemento quando determinata condizione:

List<User> list = new ... 

for (Iterator<User> it = list.iterator(); it.hasNext();) { 

    User user = it.next(); 
    if (user.getUserEmail().equals(currentUser.getUserEmail())) { 
     it.remove(); 
    } 
} 
4

si potrebbe usare qualcosa di simile:

  arrayList.removeIf(s-> s.getName().contains("yourName")); 
+0

Che cos'è 's'? Per favore, rendi le tue risposte un po 'più specifiche. –

+0

s è predicato qui e funziona solo in JDK 1.8 dove è supportata l'espressione Lambda. Rimuove tutti gli elementi di questa raccolta che soddisfano il predicato specificato. – jprism

2

Consigliato il modo per risolvere questo problema è:

ArrayList<User> list = new ArrayList<User>(); 
list.add(new User("user1","password1")); 
list.add(new User("user2","password2")); 
list.add(new User("user3","password3")); 
list.add(new User("user4","password4")); 
Iterator<String> iter = list.iterator(); 
while (iter.hasNext()) 
{ 
    User user = iter.next(); 
    if(user.name.equals("user1")) 
    { 
     //Use iterator to remove this User object. 
     iter.remove(); 
    } 
} 

L'utilizzo di Iterator per rimuovere un oggetto è più efficiente della rimozione semplicemente digitando ArrayList(Object) perché è più veloce e il 20% in più di risparmio di tempo e una pratica Java standard per le raccolte Java.

-1
ArrayList<User> userList=new ArrayList<>(); 
//load data 

public void removeUser(String userName){ 
    for (User user: userList){ 
     if(user.getName()equals(userName)){ 
      userList.remove(user); 
     } 
    } 
} 
+2

Impossibile rimuovere durante l'iterazione per ogni http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificatione-ception-when-re – Gangaraju

Problemi correlati