删除ArrayList中所有出现的第一个元素

时间:2013-02-17 19:32:13

标签: java arraylist

我想删除ArrayList中与第一个元素重复的所有元素,但我希望第一个元素保留在ArrayList中。我尝试使用for循环,但它没有删除所有重复项。

for(int i = 1; i < arraylist.size(); i++) {
    if(arraylist.get(i) == v1)
       arraylist.remove(i);
}

v1等于arraylist的第一个元素。 我也尝试过使用ListIterator,但它删除了第一个元素

ListIterator<Integer> iterator = arraylist.listIterator();
while(iterator.hasNext()) {
  if(iterator.next().intValue() == v1)
  iterator.remove();
}

你能帮帮我吗?

5 个答案:

答案 0 :(得分:3)

您需要在while loop之外单独读取第一个元素,并将其存储在某个变量中,您可以使用该变量比较其余元素,以删除:

ListIterator<Integer> iterator = arraylist.listIterator();
int first = 0;
// Check if there is a first element
if (iterator.hasNext()) {
    first = iterator.next();

    // Iterate over the rest of the elements
    while(iterator.hasNext()) {
        // If this value is equal to `first`, remove it
        if(iterator.next().intValue() == first) {
            iterator.remove();
        }
    }
}
System.out.println(arrayList);

iterator.next()将返回Integer类型的值。使用intValue()会将原语值输出。

但由于我正在与int原语进行比较,因此您根本不需要调用intValue()。在比较之前,您的Integer会自动取消装箱到原始int。因此,用以下代码替换while if语句也可以起作用:

if(iterator.next() == first) {
    iterator.remove();
}

就您的第一种方式而言,我会说,如果您想要修改正在循环的Iterator,请始终使用List。这样可以防止您面对尴尬的ConcurrentModificationException


另见:

答案 1 :(得分:1)

计算 down (不是):

Object v1 = arraylist.get(0);
for (int i = arraylist.size() - 1; i > 1; i--) {
    if (arraylist.get(i).equals(v1))
       arraylist.remove(i);
}

你必须倒计时,因为当你移除元素时,剩下的元素就会被移除。

此外,您应该将==更改为.equals()(如图所示)。

答案 2 :(得分:1)

使用Iterator及其方法remove,您正在采用正确的方法。但是你应该在循环本身之前添加对next()的调用,以便遍历第一个元素而不删除它。

ListIterator<Integer> iterator = arraylist.listIterator();
iterator.next(); // pass the first element.
while(iterator.hasNext()) {
  if(iterator.next().intValue() == v1)
  iterator.remove();
}

与其他人所说的相反,如果v1是int,则不必使用“等于”,这似乎就是这种情况。

答案 3 :(得分:0)

int v1 = arraylist.get(0);
for(int i = 0; i < arraylist.size(); i++) {
    if(arraylist.get(i) == v1){
       arraylist.remove(i);
       i--;
    }
}

如果您不想使用Iterator方法:其他答案是正确的,因为您需要从零开始索引(如果您还要删除第一个),但您还需要递减迭代变量每次从列表中删除元素时(i--行),因为您使用remove()更改列表的长度。

答案 4 :(得分:0)

最好小心从迭代中删除数组(或可迭代列表)中的元素。

根据我的经验,最简单的方法是创建一个新列表。你能考虑这样做吗?

查看你的代码,首先要记住使用“equals”而不是“==”进行比较(因为.equals意味着“有意义的等价”,我认为这就是你需要的)。 (编辑:由于自动装箱可能并不重要,但它仍然是一个很好的习惯)

但即使这样也行不通:

for (int i = 1; i < arraylist.size(); i++) {
    if (arraylist.get(i).equals(v1))
        arraylist.remove(i);
}

因为想象一下你有一个三个整数的ArrayList,都是一样的。当i == 1时,将索引1处的元素与索引0处的值进行比较,并将其删除。但是索引2处的元素成为索引1处的元素,for循环计数器会递增,从而“丢失”以删除列表中的最后一个条目。

我可以推荐这样的东西吗?

List<Integer> newlist = new ArrayList<Integer>();
newlist.add(v1);
for (Integer integer : arraylist) {
    if (!integer.equals(v1))
        newlist.add(integer);
}

祝你好运!

P.S。如果你感觉很勇敢,你或许可以做一个整齐的单线程: CollectionUtils.filter(Collection,Predicate)

CollectionUtils.filter(arraylist.subList(1, arraylist.size()), new Predicate() {
    @Override
    public boolean evaluate(Object o) {
        return !v1.equals(o);
    }
});