2013-05-19 105 views
5

我想在Java中創建一個子列表,並從上一個列表中刪除子列表中的值。我的程序正確地創建subList,但它不會從previousList中刪除正確的值。Java創建子列表並從先前列表中刪除值

我的代碼:

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

回答

9

起初j=0並刪除第一個元素。當你這樣做時,你轉移所有其他元素,所以第二個元素變成第一個,等等。

對下一次迭代j=1,所以在刪除第二個元素,這原本是第三...

爲了解決這個問題,只能使用0指數,或迭代器。

1

你爲什麼不只是做:

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

檢查[列表#子列表(https://docs.oracle.com/javase/ 8/docs/api/java/util/List.html#subList-int-int-)docs,它會返回原始列表的_view_。因此,對子列表執行修改可能以java.util.ConcurrentModificationException異常結束。 – Radu

0

從一個列表 「移動」 6元素,創造出另一個列表:

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

應當指出的是,List.subList(),返回視圖因此對origianl列表的修改將反映在子列表中,從而創建新列表並將子列表傳遞給構造函數。

爲了把這個在一個循環:

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

如果在原始列表中多次出現相同的值,則其所有實例都將通過removeAll()函數刪除。這可能會帶來無法預料的後果。 – MatsT

0

做一個單行

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