递归 - 删除重复项

时间:2013-03-16 17:19:21

标签: java

我正在研究一种方法,以递归方式删除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中。

感谢您的帮助。

5 个答案:

答案 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);
    }