删除多个列表中的重复元素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因为Set是O(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]]