我想实现一个方法,通过创建一个没有它们的新方法来从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);
}
答案 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;
}