使用Comparator检查ArrayList中的重复项

时间:2018-01-18 22:02:07

标签: java arraylist duplicates

我想实现一个方法,通过创建一个没有它们的新方法来从ArrayList中删除重复项。我已经问了一个关于这个算法的时间复杂性的问题,但显然它甚至不起作用。我很确定错误是相等检查,但我不熟悉Comparators和ArrayLists,所以任何帮助都表示赞赏。这是代码:

public static <T> ArrayList<T> noDups(Comparator<T> cmp, ArrayList<T> l) {

    ArrayList<T> noDups = new ArrayList<T>();
    for(T o : l) {
        if(!isAlreadyInArrayList2(cmp, o, l)) 
            noDups.add(o);
    }
    return noDups;
}

使用迭代器:

public static <T> boolean isAlreadyInArrayList(Comparator<T> cmp, T o, ArrayList<T> l) {

Iterator<T> i = l.iterator();
    if (o==null) {
        while (i.hasNext())
            if (i.next()==null)
                 return true;
    } else {
        while (i.hasNext())
            if (cmp.compare(o, i.next()) == 0)
                return true;
    }
    return false;
}

使用for循环:

public static <T> boolean isAlreadyInArrayList2(Comparator<T> cmp, T o, ArrayList<T> l) {

for(T obj : l) {
        if (cmp.compare(o, obj) == 0)
            return true;
    }
    return false;
}

这是我的测试,它产生一个空的ArrayList:

public static void main(String[] args) {
    Comparator<Integer> natural = Comparator.<Integer>naturalOrder();
    ArrayList<Integer> test = new ArrayList<>(Arrays.asList(1, 5, 4, 2, 2, 0, 1, 4, 2));
    System.out.println(test);
    ArrayList<Integer> testWithoutDuplicates = noDups(natural,test);
    System.out.println(testWithoutDuplicates);
}

1 个答案:

答案 0 :(得分:1)

您将错误的List传递给isAlreadyInArrayList2,将其更改为以下内容:

public static <T> ArrayList<T> noDups(Comparator<T> cmp, ArrayList<T> l) {

    ArrayList<T> noDups = new ArrayList<T>();
    for (T o : l) {
        if (!isAlreadyInArrayList2(cmp, o, noDups))
            noDups.add(o);
    }
    return noDups;
}