2014-03-13 79 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); 
    } 
}