2015-06-29 15 views
6

Chciałbym usunąć elementy z tablicy ArrayList z indeksami 0 i 1. Ale to nie działa i nie wiem sposób.ArrayList usuń element o indeksie 0 i 1

Kod wygląda następująco

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.Iterator; 


public class Test{ 

    public static void main(String[] args){ 
     Collection c = new ArrayList(); 

     c.add("A"); 
     c.add("B"); 
     c.add("C"); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 

     System.out.println(""); 
     c.remove(1); 
     c.remove(0); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 



    } 
} 

Wyjście jest

A 
B 
C 

A 
B 
C 

Ale wyjście powinno być

A 
B 
C 

C 

Odpowiedz

6

wierzę, to dlatego, że dzwonisz usunąć (int) na Collection. Kolekcja nie deklaruje metody remove (int), ale ma usunąć (Object), więc java jest autoboxing twój int do Integer. Ale ponieważ ta liczba całkowita nie znajduje się w kolekcji, nic nie jest usuwane.

2

Myślę, że trafiłeś na ważną lekcję.

Problem polega na tym, że Kolekcja nie obsługuje remove(int), tylko remove(Object). Tak więc kompilator boksuje twój int jako Integer, którego nie ma w kolekcji, a zatem nie usuwa go.

Jeśli zamiast tego zostanie zadeklarowana kolekcja jako ArrayList, to działa.

0

Zbiory są jedynie zbiorami danych, więc nie zawsze zachowują porządek. Polecam wymiany kolekcji z ArrayList

public class Test{ 


public static void main(String[] args){ 
    ArrayList c = new ArrayList(); 

    c.add("A"); 
    c.add("B"); 
    c.add("C"); 

    for(Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 

    System.out.println(""); 
    c.remove(1); 
    c.remove(0); 

    for(Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 



} 
} 
1

Jak wspomniano przez @ControlAltDel, Collection nie obsługuje remove(int) tylko remove(Object) i int jest auto-box do IntegerInteger i że nie ma w kolekcji; więc nic nie jest usuwane.

Jeśli chcesz zachować c jako kolekcję, możesz usunąć pierwsze dwie pozycje za pomocą Iterator.remove(); tak:

public static void main(final String[] args){ 
    Collection<String> c = new ArrayList<>(Arrays.asList("A","B","C")); 

    for(String str : c) 
     System.out.println(str); 
    System.out.println(); 

    Iterator<String> it = c.iterator(); 
    it.next(); 
    it.remove(); 
    it.next(); 
    it.remove(); 

    for(String str : c) 
     System.out.println(str); 
} 
2

zmienić swój C do ArrayList ponieważ:

Collection.remove (Przedmiot O)

Usuwa jedno wystąpienie określonego elementu z tego zbioru, jeśli jest obecny (operacja opcjonalna). Bardziej formalnie, usuwa element E, tak że (O == == zerowe zerowy e: o.equals (E))

W powyżej, czy to c.remove ("A"); to zadziała. Pisanie c.usunąć (1); szuka obiektu Integer do usunięcia.

ArrayList.remove (int index)

usunięcie elementu w określonej pozycji na liście. Przesuwa jakiekolwiek kolejne elementy po lewej stronie (odejmuje jeden od ich indeksów).

Więc twój program powinien być następujący:

public class Test{ 

    public static void main(String[] args){ 
     ArrayList c = new ArrayList(); 

     c.add("A"); 
     c.add("B"); 
     c.add("C"); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 

     System.out.println(""); 
     c.remove(1); 
     c.remove(0); 

     for(Iterator i = c.iterator(); i.hasNext();) 
      System.out.println(i.next()); 
    } 
} 
1

Co naprawdę potrzebne jest

c.remove((String)"A"); 
c.remove((String)"B"); 

zamiast odnoszenia się do nich za pomocą wskaźników, jeśli chcesz nadal korzystać Collection. Powodem jest to, że metoda remove oczekuje na argument. Dlatego podczas pisania c.remove(0) przeszukuje listę dla elementu 0 i próbuje go usunąć.

Proszę rozważyć porównanie wydajności podczas korzystania z Collection zamiast List dla tego przypadku.

Powiązane problemy