2017-04-27 67 views
2
public static void main(String[] args) { 
     List<String> list = new ArrayList(); 
     list.add("AA");list.add("Aw");list.add("Aw");list.add("AA"); 
     list.add("AA");list.add("A45");list.add("AA"); 
     list.add("Aal");list.add("Af");list.add("An"); 

     System.out.println(list); 

     for(int i=0;i<list.size();i++){ 
      if(list.get(i).equals("AA")){ 
      list.remove(i); 
      } 
     } 

     System.out.println(list); 
} 

我目前正在試圖刪除具有的"AA"值在ArrayList中的所有元素,但是,它只是消除其中的一些,不是全部。任何人都可以向我解釋我做錯了什麼?數組列表中ArrayList中無法刪除重複的字符串

元素:

[AA, Aw, Aw, AA, AA, A45, AA, Aal, Af, An] 

輸出後,我已經嘗試刪除所有有"AA"值的字符串。

[Aw, Aw, AA, A45, Aal, Af, An] 

爲什麼AA仍在輸出列表中?

+0

使用調試器,並找出它 – Jens

+0

http://stackoverflow.com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist?rq=1 – Jerry06

+0

可能的重複[我如何從ArrayList中刪除重複的元素?](http://stackoverflow.com/questions/203984/how-do-i-remove-repeated-elements-from-arraylist) –

回答

5

這是錯誤的:

for (int i = 0; i < list.size(); i++) { 
     if (list.get(i).equals("AA")) { 
      list.remove(i); 
     } 
    } 

,因爲您的列表,只要你刪除元素,改變它的大小....

你需要一個迭代器:

Iterator<String> iter = list.iterator(); 
    while (iter.hasNext()) { 
     if (iter.next().equals("AA")) { 
      iter.remove(); 
     } 
    } 

使用java8:

List<String> newFilteredList = list.stream().filter(i -> !i.equals("AA")).collect(Collectors.toList()); 
    System.out.println(newFilteredList); 
3

您在迭代時正在跳過項目。

當您撥打list.remove(i)時,所有元素均向左移動。因此,如果您刪除索引3處的項目,先前索引4處的項目將移至索引3處。但是,您仍在爲下一個循環遞增i,因此可以跳過檢查條目。

0

當您刪除元素時,列表的大小會發生變化,即當越來越多的元素被刪除時,列表中的元素將向左移動。

從列表中刪除所有重複的"AA"的替代方法是使用Stream#filter方法來保留所有不具有值"AA"的元素。

System.out.println(list.stream().filter(s -> !s.equals("AA")).collect(Collectors.toList())); 
0

項目的索引在數組列表中移動,因爲項目被刪除,所以迭代不正確。每次檢查者發現「AA」。您需要再次啓動循環。

0

當for = 3時,for循環跳過第5個元素。繞過此,使用下面的代碼:

List<String> list = new ArrayList(); 
list.add("AA");list.add("Aw");list.add("Aw");list.add("AA"); 
list.add("AA");list.add("A45");list.add("AA"); 
list.add("Aal");list.add("Af");list.add("An"); 
System.out.println(list); 
List newList = new ArrayList(); 
for(int i=0;i<list.size();i++){ 
    String tempStr = list.get(i); 
    if(!("AA").equals(tempStr)){ 
     newList.add(tempStr); 
    } 
} 
System.out.println(newList); 

這使我適當的輸出爲:

[AA,AW,AW,AA,AA,A45,AA,Aal的,AF,一個] [噢,噢,A45,Aal的,AF,一]

0

如果您使用的是Java 8上有一個Collection方法removeIf採用一個Predicate,這樣你就可以寫出如下代碼:

list.removeIf(each -> each.equals("AA")); 

如果您查看此方法的實現,您將看到它使用Iterator,並調用remove以滿足給定Predicate的每個元素。