首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何计算两个ArrayLists之间的差值?

如何计算两个ArrayLists之间的差值?
EN

Stack Overflow用户
提问于 2009-05-28 06:01:41
回答 10查看 148.4K关注 0票数 81

我有两个ArrayLists。

ArrayList A包含:

代码语言:javascript
复制
['2009-05-18','2009-05-19','2009-05-21']

ArrayList B包含:

代码语言:javascript
复制
['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结果应为:

代码语言:javascript
复制
['2009-05-20','2009-05-22']

如何比较?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-05-28 06:14:36

在Java语言中,您可以使用Collection接口的removeAll方法。

代码语言:javascript
复制
// 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);

上面的代码将产生以下输出:

代码语言:javascript
复制
First List: [apple, orange]
Second List: [apple, orange, banana, strawberry]
Result: [banana, strawberry]
票数 197
EN

Stack Overflow用户

发布于 2009-05-28 07:24:32

你已经有了正确的答案。如果你想使用apache commons collections (CollectionUtils)在列表(集合)之间进行更复杂和有趣的操作,它允许你进行连接/析取,寻找交集,检查一个集合是否是另一个集合的子集,以及其他一些很好的事情。

票数 20
EN

Stack Overflow用户

发布于 2017-11-08 01:13:03

在带有streams的Java8中,这实际上非常简单。编辑:可以在没有流的情况下高效,请参见下图。

代码语言:javascript
复制
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方法引用(首先需要类型推断)。

代码语言:javascript
复制
private static <T> Predicate<T> not(Predicate<T> predicate) {
    return predicate.negate();
}

如果streams有一个filterOut方法或别的什么,它看起来会更好。

另外,@Holger给了我一个想法。ArrayListremoveAll方法针对多次删除进行了优化,它只重新排列元素一次。但是,它使用给定集合提供的contains方法,因此如果listA不是很小,我们需要优化该部分。

使用前面声明的listAlistB,这个解决方案不需要Java8,而且非常高效。

代码语言:javascript
复制
List<String> result = new ArrayList(listB);
result.removeAll(new HashSet<>(listA));
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/919387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档