2011-11-17 18 views
6

Zasadniczo użytkownik przesyła łańcuch, którego Iterator przeszukuje w ArrayList. Gdy zostanie znaleziony, Iterator usunie obiekt zawierający Ciąg.Java, używanie Iteratora do wyszukiwania ArrayList i usuwania pasujących obiektów

Ponieważ każdy z tych obiektów zawiera dwa ciągi znaków, napotykam problemy z zapisaniem tych linii jako jednym.

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

Dzięki za pomoc!

+3

Obawiam się, że to pytanie nie ma większego sensu. Dlaczego musisz pisać te linie jako jedno? –

+1

to mi pomoże, dzięki .. ^^ –

Odpowiedz

34

Nie trzeba ich w jednej linii, wystarczy użyć remove aby usunąć element, kiedy mecz:

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 
    } 
} 

Pełna demo:

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

    } 
} 

wyjściowa:

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

After: 
non-match 
non-match
+0

Rozumiem twoją odpowiedź i wielkie dzięki, problem jest taki, że kiedy wpisuję 'if (it.next(). Zawiera (tekst)) {' To doesn ' t działa? Muszę przeszukiwać tylko określoną część (podpis String) każdego obiektu w ArrayList. – Nayrdesign

+0

@Nayrdesign: Upewnij się, że prawidłowo deklarujesz "Iterator" i że traktujesz to, co zwraca poprawnie. Na przykład, twój przykład tam 'if (it.next(). Zawiera (tekst)) {' działa tak, jakby 'Iterator' iterował nad ciągami, ale twoje pytanie sprawia, że ​​wygląda jak obiekt' ArrayList' zawiera obiekty 'Friend' , a nie struny. Pełne pokazanie pokazuje, jak zrobić to poprawnie. Bit klucza deklaruje 'Iterator ', więc 'Iterator' jest iterowaniem po instancjach' Friend', więc 'it.next()' będzie 'Friend', wtedy możesz zrobić 'if (it.next(). getFriendCaption(). zawiera (tekst)) {'. –

+0

@TJCrowder I mój program wzorowany dokładnie po twoich ale ja dostaję: Wyjątek w wątku "main" java.util.NoSuchElementException \t na java.util.AbstractList $ Itr.next (AbstractList.java:350) \t w RandomInt .messAroundWithListAgain (RandomInt.java:74) \t w RandomInt.main (RandomInt.java:85) – hologram

Powiązane problemy