返回java中两个列表之间的差异

Ror*_*ter 34 java filtering list object

我有两个数组列表,例如

List<Date> a;
contains : 10/10/2014, 10/11/2016

List<Date> b;
contains : 10/10/2016
Run Code Online (Sandbox Code Playgroud)

如何在列表之间进行检查a,b以便b返回缺少的值?例如10/10/2014

Pab*_*ruz 46

您可以将它们转换为Set集合,并对Set它们执行操作.

像这样:

Set<Date> ad = new HashSet<Date>(a);
Set<Date> bd = new HashSet<Date>(b);
ad.removeAll(bd);
Run Code Online (Sandbox Code Playgroud)

  • `removeAll`返回一个`boolean`而不是`Set` (28认同)
  • 不需要创建`bd``HashSet`.你可以调用`ad.removeAll(b)`. (8认同)
  • 没错,但是当您查看文档时,您会发现此布尔值通知或不通知“此集合因调用而更改”。进行此更改后,您可以将Set取值,您会注意到它具有预期的结果。 (4认同)
  • 如果 bd 的元素比 ad 多怎么办?在那种情况下会发生什么? (2认同)

Den*_*ich 26

如果您只想在b中找到缺失值,则可以执行以下操作:

List toReturn = new ArrayList(a);
toReturn.removeAll(b);

return toReturn;
Run Code Online (Sandbox Code Playgroud)

如果要查找列表中存在的值,可以执行两次上码.更改列表.

  • 由于您创建了一个新列表,因此这也适用于不可修改的列表。 (2认同)

Mil*_*eto 11

您可以按Java 8 Stream库使用过滤器

List<String> aList = Arrays.asList("l","e","t","'","s");
List<String> bList = Arrays.asList("g","o","e","s","t");

List<String> result = aList.stream().filter(aObject -> {
     return bList.contains(aObject);
 }).collect(Collectors.toList());

//or more reduced without curly braces and return
List<String> result2 = aList.stream().filter(aObject -> 
!bList.contains(aObject)).collect(Collectors.toList());

System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

结果:

[e, t, s]
Run Code Online (Sandbox Code Playgroud)


con*_*ost 7

您可以使用Apache Commons Collections 4.0中的CollectionUtils:

new ArrayList<>(CollectionUtils.subtract(a, b))
Run Code Online (Sandbox Code Playgroud)


jus*_*tMe 7

我看上去很相似,但我想在两个列表中都有所不同(两个列表之间的元素不常见):

假设我有:

List<String> oldKeys = Arrays.asList("key0","key1","key2","key5");
List<String> newKeys = Arrays.asList("key0","key2","key5", "key6");
Run Code Online (Sandbox Code Playgroud)

我想知道已添加了哪个键,而删除了哪个键,即我想获取(key1,key6)

使用org.apache.commons.collections.CollectionUtils

List<String> list = new ArrayList<>(CollectionUtils.disjunction(newKeys, oldKeys));
Run Code Online (Sandbox Code Playgroud)

结果

[key1,key6]


小智 6

首先将列表转换为集合。

// create an empty set 
Set<T> set = new HashSet<>(); 

// Add each element of list into the set 
for (T t : list) 
    set.add(t); 
Run Code Online (Sandbox Code Playgroud)

您可以使用Sets.difference(Set1, Set2),它返回 Set1 中存在的额外项目。
您可以使用Sets.difference(Set2, Set1),它返回 Set2 中存在的额外项目。


Isk*_*der 5

使用 Stream API,您可以执行以下操作:

List<String> aWithoutB = a.stream()
    .filter(element -> !b.contains(element))
    .collect(Collectors.toList());

List<String> bWithoutA = b.stream()
    .filter(element -> !a.contains(element))
    .collect(Collectors.toList());

Run Code Online (Sandbox Code Playgroud)