[英]Efficient way how to check differences between two collections in Java
I am having a List
of strings {1,2,7}
我有一个字符串
List
{1,2,7}
Now I have a new List
: {2,4,9}
现在我有一个新
List
: {2,4,9}
Rules are simple:规则很简单:
so the outcome is two new lists:所以结果是两个新列表:
delete list: {1,7}
删除列表:
{1,7}
create list: {4,9}
创建列表:
{4,9}
Any idea how to make it efficient within java?知道如何在java中使其高效吗? perhaps using Java8 to make it easier?
也许使用Java8使它更容易?
My lists have about 1000 elements.我的列表有大约 1000 个元素。
delete_list = A.copy();
create_list = B.copy();
delete_list.stream().removeIf(e -> B.contains(e));
create_list.stream().removeIf(e -> A.contains(e));
Basically we just create two distinct list.基本上我们只是创建两个不同的列表。 In set theory we can write the output like this:
在集合论中,我们可以这样写输出:
delete_list = A \\ B
delete_list = A \\ B
create_list = B \\ Acreate_list = B\\A
Thanks @SashaSalauyou for calling my attention on a mistake i made.感谢@SashaSalauyou 提醒我注意我犯的错误。
If ordering is not important, use Set
bulk operations:如果排序不重要,请使用
Set
批量操作:
Set<String> a = new HashSet<>(Arrays.asList("1", "2", "7"));
Set<String> b = new HashSet<>(Arrays.asList("2", "4", "9"));
Set<String> deleteSet = new HashSet<>(a);
deleteSet.removeAll(b); // [1, 7]
Set<String> createSet = new HashSet<>(b);
createSet.removeAll(a); // [4, 9]
If you want Java 8, just filter elements and collect:如果您想要 Java 8,只需过滤元素并收集:
List<String> deleteList = a.stream().filter(e -> !b.contains(e)).collect(Collectors.toList());
List<String> createList = b.stream().filter(e -> !a.contains(e)).collect(Collectors.toList());
Here, a
and b
could be lists, but it is highly recommended to make them Set
s since contains()
operation is O(n) in most list implementations.这里,
a
和b
可以是列表,但强烈建议将它们Set
s,因为在大多数列表实现中contains()
操作是 O(n)。
Though not very elegant solution but we can also use Streams
in Java8:虽然不是很优雅的解决方案,但我们也可以在 Java8 中使用
Streams
:
Set<String> setOne = new HashSet<>(Arrays.asList("1","2","7"));
Set<String> setTwo = new HashSet<>(Arrays.asList("2","4","9"));
System.out.println(setOne.stream().filter(i-> !setTwo.contains(i)).collect(Collectors.toList()));
System.out.println(setTwo.stream().filter(i-> !setOne.contains(i)).collect(Collectors.toList()));
It prints:它打印:
[1, 7] [4, 9]
One important point is that setOne
and setTwo
should be effectively final to work in a lambda expression.重要的一点是
setOne
和setTwo
应该是有效的 final 才能在 lambda 表达式中工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.