删除数组中一个接一个的重复项

时间:2017-05-24 10:24:11

标签: java arraylist

我无法意识到如何正确地循环删除所有重复的数组。 例如,我有一个下一个数组列表:

public static void main(String[] args) {
        ArrayList<Integer> integers = new ArrayList<Integer>();
        integers.add(0);
        integers.add(0);
        integers.add(0);
        integers.add(1);
        integers.add(0);
        integers.add(0);
        integers.add(1);
        integers.add(1);
        integers.add(1);
        integers.add(0);
        integers.add(1);
        integers.add(0);
        integers.add(0);
        integers.add(0);
        integers.add(0);
        integers.add(1);
        integers.add(1);
        integers.add(0);
}

结果应该是:

{0,1,0,1,0,1,0,1,0}

我试图这样做:

for(int i = 0; i < integers.size(); i++){
            for(int j = i + 1; j < integers.size(); j++){
                if (integers.get(i) == integers.get(j)){
                    integers.remove(integers.get(i));
                    break;
                }
            }
        }

但是当“i”没有增加时,我不希望每个“j”循环。

你能给个建议吗?

3 个答案:

答案 0 :(得分:3)

您可以通过跟踪从列表中读取的最后一个值来执行此操作:

int last = integers.get(0);
for(int i = 1; i < integers.size(); i++) {
    if (integers.get(i).equals(last)) {
        integers.remove(i);
        i--;
    } else {
        last = integers.get(i);
    }
}

P.S。 integers.remove(integers.get(i));无论如何都是错误的,因为它会从integers.get(i)中删除第一次出现的List,您应该删除当前的匹配项。因此,您应该按索引而不是按值删除。

答案 1 :(得分:2)

你可以在一个循环中完成

for (int i = 0 ; i < integers.size() - 1 ; ++i) {
    if (integers[i].equals(integers[i + 1])) {
        integers.remove(i + 1);
        --i;
    }
}

如果您有匹配项删除副本并减少迭代变量,remove会移动ArrayList左侧的元素。

答案 2 :(得分:1)

您可以使用迭代器:

Iterator<Integer> it = integers.iterator();
int last = it.next();
int current;

while( it.hasNext())
{
    current = it.next();
    if( current == last)
    {
        it.remove();
    }
    else
    {
        last = current;
    }
}