2013-05-19 8 views
5

Chcę utworzyć podlistę w Javie i usunąć wartości z podlisty z poprzedniej listy. Mój program poprawnie tworzy subList, ale nie usuwa poprawnych wartości z poprzedniej listy.Java Utwórz podlistę i usuń wartości z poprzedniej listy.

mój kod:

for(int i=0; i<4; i++){ 
    List<Object> sub=new ArrayList<Object>(prevoiusList.subList(0,6)); 

    for (int j=0; j<6; j++){ 
     previousList.remove(j); 
    } 
}  

Odpowiedz

9

Na pierwszy j=0 i usunąć pierwszy element. Gdy to zrobisz, zmienisz wszystkie pozostałe elementy, aby drugi element stał się pierwszy i tak dalej.

Na następnej iteracji j=1, więc usunąć drugi element, który był pierwotnie trzeci ...

Aby rozwiązać ten problem, należy używać tylko 0 indeksu lub iterator.

1

Dlaczego nie po prostu zrobić:

previousList = previousList.subList(7, previousList.size()); 
+0

Sprawdź [List] (# podmenu https://docs.oracle.com/javase/ 8/docs/api/java/util/List.html # subList-int-int-) docs, zwraca _view_ oryginalnej listy. W ten sposób wykonywanie modyfikacji na podlistach może zakończyć się 'java.util.ConcurrentModificationException'. – Radu

0

Do "przenieść" 6 elementów z jednej listy, aby utworzyć kolejną listę:

List<Object> list; 
List<Object> subList = new ArrayList<Object>(list.subList(0, 6)); 
list.removeAll(subList); 

Należy zauważyć, że List.subList(), zwraca widok listy, więc modyfikacje listy źródłowej zostaną odzwierciedlone na liście podrzędnej, tworząc nową listę i przekazując ją do konstruktora.

Aby umieścić to w pętli:

List<Object> list; 
while (list.size() > 5) { 
    List<Object> subList = new ArrayList<Object>(list.subList(0, 6)); 
    list.removeAll(subList); 
    // do something with subList 
} 
// list now has 0-5 elements 
+0

Jeśli ta sama wartość pojawi się wiele razy na oryginalnej liście, wszystkie jej wystąpienia zostaną usunięte przez removeAll(). Może to mieć nieprzewidziane konsekwencje. – MatsT

0

zrobić to w jednym wierszu

prevoiusList.subList(0,6).clear()