2011-11-17 26 views
6

Básicamente, el usuario envía una cadena para la cual el iterador busca una ArrayList. Cuando se encuentre, el iterador eliminará el objeto que contiene la cadena.Java, utilizando Iterator para buscar en una ArrayList y eliminar objetos coincidentes

Como cada uno de estos objetos contiene dos cadenas, encuentro problemas para escribir estas líneas como una sola.

Friend current = it.next(); 
String currently = current.getFriendCaption(); 

Gracias por cualquier ayuda!

+3

Me temo que la pregunta no tiene mucho sentido. ¿Por qué necesitas escribir esas líneas como una sola? –

+1

es que me ayude, gracias .. ^^ –

Respuesta

34

Usted no los necesita en una sola línea, sólo tiene que utilizar remove eliminar un elemento cuando coincide:

Iterator<Friend> it = list.iterator(); 
while (it.hasNext()) { 
    if (it.next().getFriendCaption().equals(targetCaption)) { 
     it.remove(); 
     // If you know it's unique, you could `break;` here 
    } 
} 

demostración completa:

import java.util.*; 

public class ListExample { 
    public static final void main(String[] args) { 
     List<Friend> list = new ArrayList<Friend>(5); 
     String   targetCaption = "match"; 

     list.add(new Friend("match")); 
     list.add(new Friend("non-match")); 
     list.add(new Friend("match")); 
     list.add(new Friend("non-match")); 
     list.add(new Friend("match")); 

     System.out.println("Before:"); 
     for (Friend f : list) { 
      System.out.println(f.getFriendCaption()); 
     } 

     Iterator<Friend> it = list.iterator(); 
     while (it.hasNext()) { 
      if (it.next().getFriendCaption().equals(targetCaption)) { 
       it.remove(); 
       // If you know it's unique, you could `break;` here 
      } 
     } 

     System.out.println(); 
     System.out.println("After:"); 
     for (Friend f : list) { 
      System.out.println(f.getFriendCaption()); 
     } 

     System.exit(0); 
    } 

    private static class Friend { 
     private String friendCaption; 

     public Friend(String fc) { 
      this.friendCaption = fc; 
     } 

     public String getFriendCaption() { 
      return this.friendCaption; 
     } 

    } 
} 

Salida:

$ java ListExample 
Before: 
match 
non-match 
match 
non-match 
match 

After: 
non-match 
non-match
+0

entiendo su respuesta y gracias en gran medida, el problema es que cuando escribo 'si (it.next(). Contains (texto)) {' Doesn' t trabajo? Necesito buscar solo una determinada parte (título de cadena) de cada objeto en ArrayList. – Nayrdesign

+0

@Nayrdesign: asegúrese de declarar correctamente el 'Iterator' y de que está tratando lo que devuelve correctamente. Por ejemplo, su ejemplo allí 'if (it.next(). Contains (text)) {' actúa como 'Iterator' iterando sobre cadenas, pero su pregunta hace que parezca que' ArrayList' contiene objetos 'Friend' , no cuerdas. La demostración completa muestra cómo hacerlo correctamente. El bit clave declara 'Iterator ' por lo que 'Iterator' itera sobre las instancias' Friend', de modo que 'it.next()' será un 'Friend', luego puede hacer' if (it.next(). getFriendCaption(). contains (text)) {'. –

+0

@TJCrowder modelé mi programa exactamente después de la suya, pero estoy consiguiendo: Excepción en el hilo java.util.NoSuchElementException "principal" \t en java.util.AbstractList $ Itr.next (AbstractList.java:350) \t en randomInt .messAroundWithListAgain (RandomInt.java:74) \t en RandomInt.main (RandomInt.java:85) – hologram

Cuestiones relacionadas