2014-03-13 81 views
1

我在做一個簡單的Java程序,我需要刪除String ArrayList中的所有連續副本。刪除ArrayList中的連續副本[Java]

我的字符串的ArrayList是這樣的:

list = [a,b,c,c,d,a,b,c,d] 

我的目標是消除所有(且僅!)連續重複,這樣的結果將是:A,B,C,d,一, b,C,d]。正如你所看到的,兩個連續的「c」之一已被刪除。

我想是這樣的:

for (int i = 0; i<list.size(); i++) { 

     if (list.get(i).compareTo(list.get(i+1))==0) { 
      positionToRemove.add(i); 
     } 

    } 

凡positionToRemove將在年底包含連續元素,我會再取出使用list.remove(所有位置)(還沒有完成)

不幸的是我得到

java.lang.IndexOutOfBoundsException 

我相當肯定的有一個很簡單的方法來實現這一點,但我不能在那一刻記住它!

回答

0

for循環的最後一次迭代中,list.get(i+1)超出了列表的界限,因此也超出了IndexOutOfBoundsException的範圍。在任何陣列/陣列列表中,最大可訪問索引始終爲size/length - 1

爲了解決這個問題,你需要改變一下你的邏輯。

for (int i = 1; i<list.size(); i++) { 
    if (list.get(i-1).compareTo(list.get(i))==0) { 
     positionToRemove.add(i); 
    } 
} 
+1

我總是遇到邊界異常的問題,但這對於我理解循環如何工作非常有用。非常感謝! – NoobNe0

0

當您訪問List使用索引+ 1或i+1,你超越了List的邊界上最後一次迭代。您可以通過將for循環的條件設置爲i < list.size() -1來解決此問題。

for (int i = 0; i < list.size() -1; i++) { 
     if (list.get(i).compareTo(list.get(i+1))==0) { 
      positionToRemove.add(i); 
     } 
} 
0

凡positionToRemove將在末端含有 連續元素的所有位置,我將然後刪除使用list.remove() (仍然沒有完成)

代替存儲每個位置,您可以從列表的末尾開始,直接刪除當前元素,如果它與其左側相鄰。使用這個,你不需要創建另一個包含要刪除的對象索引的列表。

List<String> list = new ArrayList<>(Arrays.asList("a","b","c","c","d","a","b","c","d")); 
for(int i = list.size() - 1; i > 0; i--){ 
    if(list.get(i).compareTo(list.get(i-1)) == 0){ 
     list.remove(i); 
    } 
} 
System.out.println(list); 

,輸出:

[a, b, c, d, a, b, c, d] 
1

沒有必要存儲您需要刪除的元素的索引。只需將其直接刪除:

int size = list.size(); 
for (int i = size - 1; i >= 1; i--) { 
    if (list.get(i).compareTo(list.get(i - 1)) == 0) { 
     list.remove(i); 
    } 
} 
0

它不應該達到您的列表長度。您必須關閉大小爲-1的遍歷。

for (int i = 0; i<list.size() - 1; i++) { 
    if (list.get(i).compareTo(list.get(i+1))==0) { 
     positionToRemove.add(i); 
    } 
}