例如,list1有" a,b,c"和list2有" b,c,t"。结果," a"应该退还。
这是我的代码:
public static <E> List<I> ReturnDifference(List<E> L1, List<E> L2)
{
List<E> L3 = new ArrayList<I>();
Iterator<E> iter1 = L1.iterator();
while (iter1.hasNext())
{
String s1 = (String)iter1.next();
Iterator<E> iter2 = L2.iterator();
while (iter2.hasNext())
{
String s2 = (String)iter2.next();
if (s1.compareTo(s2) != 0)
{
L3.add((E)s1);
}
}
}
return L3;
}
感谢您帮助我!
答案 0 :(得分:2)
其他答案指出,有第三方库会做这种事情。他们将以更少的努力完成工作......并且比代码可能更有效率。
但是,我假设这是一次“学习练习”。所以这里有一些代码中的问题。
从最基本的开始:
使用“for each”语法:
Iterator<T> it = x.iterator();
while (it.hasNext()) {
T t = it.next();
...
}
相当于
for (T t: x.iterator() {
...
}
如果使用任何不是字符串列表的参数调用ReturnDifference
,您对类型转换的使用将会中断。
String s1 = (String)iter1.next();
应该是
E s1 = iter1.next();
依此类推。
您无需使用compareTo
。请改用equals
。这样做的好处是可以处理未实现Comparable<E>
的元素类型。
为什么要返回参数类型为I
而不是E
的列表?
无数样式错误。最重要的是:
最后,您的代码中存在明显的逻辑错误:
if (s1.compareTo(s2) != 0) {
L3.add((E)s1);
}
如果你看一下代码中的那个语句,并考虑一下......很明显你要多次向L3
添加相同的元素。
我会留给你弄清楚如何处理它。
1 - 从技术上讲,编译器允许你忽略它,但你&gt;&gt;可以&lt;&lt;让自己陷入困境。但更重要的是,如果您要求经验丰富的Java程序员阅读严重忽略样式约定的代码,他/她可能会直接拒绝。
答案 1 :(得分:0)
如何使用Apache Commons Substract方法?
答案 2 :(得分:0)
您可以尝试CollectionUtils中的intersection()和subtract()方法。
intersection()方法为您提供包含公共元素的集合,而subtract()方法为您提供了所有不常见的元素。
答案 3 :(得分:0)
不需要for
循环或第三方库
它由内置的removeAll(Collection<?> c)
方法支持。
List<String> list1 = Arrays.asList("a","b","c");
List<String> list2 = Arrays.asList("b","c","t");
List<String> result = new ArrayList<>(list1);
result.removeAll(list2);
System.out.println(result); // prints: [a]
如果由于list2
大而导致性能下降,请先将其转换为Set
,因为removeAll()
方法是通过调用{{3}来实现的}}:
result.removeAll(new HashSet<>(list2));
技术上将性能从 O(m⋅n)改为 O(m + n)。