我有两个ArrayLists。
ArrayList A包含:
['2009-05-18','2009-05-19','2009-05-21']
ArrayList B包含:
['2009-05-18','2009-05-18','2009-05-19','2009-05-19','2009-05-20','2009-05-21','2009-05-21','2009-05-22']
我必须比较ArrayList A和ArrayList B。结果ArrayList应该包含ArrayList A中不存在的列表。
ArrayList结果应为:
['2009-05-20','2009-05-22']
如何比较?
发布于 2009-05-28 06:14:36
在Java语言中,您可以使用Collection
接口的removeAll
方法。
// Create a couple ArrayList objects and populate them
// with some delicious fruits.
Collection firstList = new ArrayList() {{
add("apple");
add("orange");
}};
Collection secondList = new ArrayList() {{
add("apple");
add("orange");
add("banana");
add("strawberry");
}};
// Show the "before" lists
System.out.println("First List: " + firstList);
System.out.println("Second List: " + secondList);
// Remove all elements in firstList from secondList
secondList.removeAll(firstList);
// Show the "after" list
System.out.println("Result: " + secondList);
上面的代码将产生以下输出:
First List: [apple, orange]
Second List: [apple, orange, banana, strawberry]
Result: [banana, strawberry]
发布于 2009-05-28 07:24:32
你已经有了正确的答案。如果你想使用apache commons collections (CollectionUtils)在列表(集合)之间进行更复杂和有趣的操作,它允许你进行连接/析取,寻找交集,检查一个集合是否是另一个集合的子集,以及其他一些很好的事情。
发布于 2017-11-08 01:13:03
在带有streams的Java8中,这实际上非常简单。编辑:可以在没有流的情况下高效,请参见下图。
List<String> listA = Arrays.asList("2009-05-18","2009-05-19","2009-05-21");
List<String> listB = Arrays.asList("2009-05-18","2009-05-18","2009-05-19","2009-05-19",
"2009-05-20","2009-05-21","2009-05-21","2009-05-22");
List<String> result = listB.stream()
.filter(not(new HashSet<>(listA)::contains))
.collect(Collectors.toList());
请注意,哈希集只创建一次:方法引用与其包含的方法绑定在一起。对lambda做同样的事情需要在一个变量中设置。创建一个变量并不是一个坏主意,特别是当你觉得它难看或者难以理解的时候。
如果没有这个实用程序方法(或显式强制转换),您就不能轻松地进行否定,因为您不能直接调用negate the predicate方法引用(首先需要类型推断)。
private static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
如果streams有一个filterOut
方法或别的什么,它看起来会更好。
另外,@Holger给了我一个想法。ArrayList
的removeAll
方法针对多次删除进行了优化,它只重新排列元素一次。但是,它使用给定集合提供的contains
方法,因此如果listA
不是很小,我们需要优化该部分。
使用前面声明的listA
和listB
,这个解决方案不需要Java8,而且非常高效。
List<String> result = new ArrayList(listB);
result.removeAll(new HashSet<>(listA));
https://stackoverflow.com/questions/919387
复制相似问题