我在制作一个会返回数组列表的不同整数的方法时遇到问题。我真的想删除重复项,然后只显示数组列表。我无法弄清楚问题是什么。当我测试它时,这是我得到的输出:[3,11,33,10]
这是我的代码
package getUniques;
import java.util.ArrayList;
public class Uniques {
public static ArrayList<Integer> getUniques( ArrayList<Integer> list ){
int i = 0;
while(i < list.size() - 1){
for (int j = 0; j < list.size(); j++){
if (list.get(i) == list.get(j))
list.remove(i);
}
i++;
}
return list;
}
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(3);
list.add(5);
list.add(11);
list.add(22);
list.add(33);
list.add(22);
list.add(10);
System.out.println(getUniques(list));
}
}
答案 0 :(得分:2)
您还可以使用Set获取唯一值。在Set
中插入值,然后将其重新放回ArrayList
<{1}},如new ArrayList(theSet);
答案 1 :(得分:1)
迭代时更改列表总是会引起痛苦! 假设你删除第3项(所以旧的第4个成为新的3) - 然后你做我的++,所以你实际上正在跳过“旧的第4”元素。
如果您删除了该项目以重新回到正轨,则可以跳过i++
解决方案:
首先使用Set或类似设置,这样就无法获得重复项。
使用第二个列表保存所需项目的值(或索引) 删除(如果使用索引,您可以将它们从最高到最低删除 否则你最终会遇到同样的问题:删除索引1,索引4现在 指数3 ...)
翻转您的搜索,以便您回到0,同样的校长 适用。您可以删除高索引而不会影响较低的索引。
使外循环使用迭代器,以便您可以使用删除操作。
答案 2 :(得分:0)
要在迭代时删除项目,必须使用迭代器,因为它保证了顺序:
Iterator<Integer> iterator = list.iterator();
int i = 0;
List<Integer> listCopy = new ArrayList<Integer>(list);
while(iterator.hasNext()){
i++;
Integer value = iterator.next()
for (int j = i; j < listCopy.size(); j++){
if (value.equals(listCopy.get(j))) {
iterator.remove();
}
}
}
但是,在这种情况下,由于您需要在同一列表中迭代两次,因此它不是最佳解决方案。将所有内容放入已排序的Set可能会更快,因为Set会自行删除重复项。
答案 3 :(得分:0)
您的代码存在一些问题。以下是对现有代码的修复:
首先,您要删除错误的索引。您已将j
处的元素标识为副本;删除它而不是i
处的元素。
list.remove(j); // j not i
接下来,您要移除所有相同的元素,并且不会离开“原始”元素。要解决此问题,请仅测试(并删除)循环中过去i
的那些。
for (int j = i + 1; j < list.size(); j++){ // Start at i + 1, not 0.
然后,您需要在删除后再重试j
索引,因为其余元素已向后移动1个点。而不是
if (list.get(i) == list.get(j))
list.remove(i);
尝试
if (list.get(i) == list.get(j))
{
list.remove(j);
j--; // Try this j again next loop, once it's incremented again.
}