我想删除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();
}
你能帮帮我吗?
答案 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);
}
});