删除多个列表中的重复元素java8

我有三个字符串列表。现在我需要确保一个元素只出现在这三个列表之一中。我不想在列表中重复。您可以假设每个列表中没有重复项。

我尝试使用removeIf()及其服务于我的目的。我确定这不是最好的方法。在 Java 8+ 中有没有其他方法可以做到这一点?

列表的优先级是 list1 > list2 > list3

List<String> list1 = Stream.of("23","45","655","43","199").collect(Collectors.toList());
List<String> list2 = Stream.of("13","23","54","655","111","13").collect(Collectors.toList());
List<String> list3 = Stream.of("76","45","33","67","43","13").collect(Collectors.toList());

list2.removeIf(i->list1.contains(i));
list3.removeIf(i->list1.contains(i) || list2.contains(i));

System.out.println(list1);
System.out.println(list2);
System.out.println(list3);

输出低于预期

[23, 45, 655, 43, 199]
[13, 54, 111, 13]
[76, 33, 67]

回答

我会建议使用Set,而不是List因为SetO(1)时间复杂度

 List<String> list1 = Stream.of("23","45","655","43","199").collect(Collectors.toList());
 List<String> list2 = Stream.of("13","23","54","655","111","13").collect(Collectors.toList());
 List<String> list3 = Stream.of("76","45","33","67","43","13").collect(Collectors.toList());

然后通过组合将所有元素流式传输,并将不同的元素收集到相应的列表中 Collectors.groupingBy

Collection<List<String>> result = Stream.of(list1,list2,list3)
            .flatMap(List::stream)
            .distinct()
            .collect(Collectors.groupingBy(v->list1.contains(v) ? 0 : (list2.contains(v) ? 1 : 2))).values();

    System.out.println(result);  //[[23, 45, 655, 43, 199], [13, 54, 111], [76, 33, 67]]


以上是删除多个列表中的重复元素java8的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>