删除ArrayList [Java]中的连续重复项

时间:2014-03-13 11:33:35

标签: java arraylist

我正在做一个简单的Java程序,我需要删除String ArrayList中的所有连续重复项。

我的String ArrayList是这样的:

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

我的目标是删除所有(并且只有!)连续的重复项,以便结果为:[a,b,c,d,a,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

我很肯定有一种非常简单的方法来实现这一目标,但我现在还记不起来了!

6 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

for循环的最后一次迭代中,list.get(i+1)超出了列表的范围,因而超出了IndexOutOfBoundsException。在任何数组/ arraylist中,最大可访问索引始终为size/length - 1

要解决此问题,您需要更改一下逻辑。

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

答案 2 :(得分:0)

当您使用索引+ 1或List访问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);
        }
 }

答案 3 :(得分: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]

答案 4 :(得分:0)

它不应达到列表的长度。您必须以-1的大小关闭遍历。

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

答案 5 :(得分:0)

您可以使用Java 7使用迭代器来做到这一点。

Iterator<Integer> iterator = collection.values().iterator();
Integer previousValue = null;

while(iterator.hasNext()) {
    Integer currentValue = iterator.next();
    if(currentValue.equals(previousValue)){
        iterator.remove();
    }
    previousValue = currentValue;
}