我正在研究一种方法,以递归方式删除ArrayList中元素的重复项。但我遇到了一些问题,我的方法有效并删除了一些元素,但并不是所有重复的元素。
这是我的输入:
100, 200, 200, 300, 400, 300, 100, 500, 500, 400, 100, 400, 100, 100
这是输出:
100, 200, 300, 400, 100, 500, 100
我的方法:
public static void removeDuplicates(ArrayList<Integer> list, int counter){
if(list == null){
throw new NullPointerException();
}
if(counter < list.size()){
if(list.contains(list.get(counter))){
list.remove(list.lastIndexOf(list.get(counter)));
}
removeDuplicates(list, ++counter);
}
}
我知道我只删除了所述值的最后一个元素,然后迭代到下一个元素。我想知道如何更改它以删除所有重复的元素。此外,我输出的一部分让我感到困惑的是,有三个值为'400',但只有一个显示在output中。
感谢您的帮助。
答案 0 :(得分:2)
除了@NPE是正确的(我假设这是作业),你应该考虑使用非常相同的头来调用你的函数,只要找到重复的元素。如果没有找到重复,则仅使用下一个元素(即,增加counter
)。
答案 1 :(得分:1)
list.remove()
会减少list.size()
,这意味着每次删除某个项目并提前counter
时,您最终都会跳过一个项目。
答案 2 :(得分:1)
试试这个:
public static void removeDuplicates(ArrayList<Integer> list, int counter){
if(list == null){
throw new NullPointerException();
}
if(counter < list.size()){
if(list.contains(list.get(counter))){
if(list.lastIndexOf(list.get(counter))!=counter)
{
list.remove(list.lastIndexOf(list.get(counter)));
counter--;
}
}
removeDuplicates(list, ++counter);
}
}
答案 3 :(得分:0)
我的第一个问题是你为什么使用递归?简单地从旧列表中构建新列表就更简单了。
如果您完成调用序列,删除字符串中的项目,您会发现输出符合预期。
Pass 1删除最后100个
100,200,200,300,400,300,100,500,500,400,100,400,100
Pass 2删除最后200个
100,200,300,400,300,100,500,500,400,100,400,100
通过3删除最后300
100,200,300,400,100,500,500,400,100,400,100
Pass 4删除最后400
100,200,300,400,100,500,500,400,100,100
Pass 5删除最后100个
100,200,300,400,100,500,500,500,100,100
Pass 6删除最后500
100,200,300,400,100,500,400,100
Pass 7删除任何内容 Pass 8删除任何内容
答案 4 :(得分:0)
试
if (counter < list.size()) {
int i = list.lastIndexOf(list.get(counter));
if (i > counter) {
list.remove(i);
} else {
counter++;
}
removeDuplicates(list, counter);
}