0

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

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

v1 等于数组列表的第一个元素。我也尝试使用 ListIterator,但它删除了第一个元素

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

你能帮我么?

4

5 回答 5

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因此,将ifwhile 中的语句替换为以下语句也可以:

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

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


也可以看看:

于 2013-02-17T19:37:48.283 回答
1

倒计时(不倒计时)

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

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

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

于 2013-02-17T19:36:20.263 回答
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 是 an ,您不必使用“等于” int,这似乎是这种情况。

于 2013-02-17T19:37:45.577 回答
0

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

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

查看您的代码,首先请记住使用“等于”而不是“==”进行比较(因为 .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);
}

祝你好运!

PS如果你觉得勇敢,你可以做一个简洁的单行: CollectionUtils.filter(Collection,Predicate)

CollectionUtils.filter(arraylist.subList(1, arraylist.size()), new Predicate() {
    @Override
    public boolean evaluate(Object o) {
        return !v1.equals(o);
    }
});
于 2013-02-17T19:53:13.803 回答
0
int v1 = arraylist.get(0);
for(int i = 0; i < arraylist.size(); i++) {
    if(arraylist.get(i) == v1){
       arraylist.remove(i);
       i--;
    }
}

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

于 2013-02-17T19:39:10.830 回答