[英]Java - How can I compare 2 sets on a custom equals/comparator without TreeSet?
所以我有2个汽车清单
(伪代码)
Class car
private String make
private String model
private Set<String> addons
List<Car> carsMine = ...
List<Car> carsDealers = ...
目前,我想根据不同的标准找到这两个列表之间的差异
例如,如果我想在carsDealers
中查找与carsMine
中的汽车具有相同make
和addons
的所有汽车。
目前,我正在做
class MyComparator<Car> implements Comparator<Car> {
public int compare(Car a, Car b) {
result = a.make.compareTo(b.make)
if (result == 0) {
if (a.addons.size() != b.addons.size()) {
return -1
}
if (!a.addons.containsAll(b.addons)) {
return -1
}
return result
}
}
TreeSet<Car> carsMineTreeSet = new TreeSet<Car>(new MyComparator<Car>);
carsMineTreeSet.addAll(carsMine)
TreeSet<Car> carsDealerTreeSet = new TreeSet<Car>(new MyComparator<Car>);
carsDealerTreeSet.addAll(carsDealers)
carsMineTreeSet.retainAll(carsDealerTreeSet);
List<Car> carsWithSameMakeAndAddons = new ArrayList<Car>(carsMineTreeSet);
由于我在各种其他条件下执行此操作,因此我正在创建自定义比较器并重复此操作。
如果我想在carsMine 中找到与carsDealers 中的汽车具有相同品牌和插件的所有汽车。
这似乎不适用于将TreeSet
与提到的MyComparator
使用。
例如,汽车清单如下:
List<Car> mine = Arrays.asList(
new Car("BMW", "X5", Set.of("a", "b", "c")),
new Car("BMW", "X6", Set.of("a", "b", "c")),
new Car("Opel", "Astra", Set.of("a"))
);
List<Car> dealers = Arrays.asList(
new Car("BMW", "X5", Set.of("a", "b", "c")),
new Car("Audi", "Q7", Set.of("a", "b", "c")),
new Car("BMW", "i8", Set.of("a", "b", "c"))
);
然后在使用忽略model
字段的比较器转换为TreeSet
时,该集合“丢失”了一辆宝马汽车。
TreeSet<Car> carsMineTreeSet = new TreeSet<Car>(new MyComparator());
carsMineTreeSet.addAll(mine);
System.out.println("treeset: mine: " + carsMineTreeSet);
///////////
treeset: mine: [{make=BMW model=X5 addons=[c, b, a]}, {make=Opel model=Astra addons=[a]}]
因此,无法实现查找所有具有匹配make
和addons
的汽车的最初目的。
这可以通过在经销商列表中构建一组“键”来解决,然后过滤另一个列表:
Set<String> keys = dealers.stream()
.map(c -> c.make + c.addons)
.collect(Collectors.toSet());
List<Car> cars = mine.stream()
.filter(c -> keys.contains(c.make + c.addons))
.collect(Collectors.toList());
System.out.println(cars);
Output:
[{make=BMW model=X5 addons=[c, a, b]}, {make=BMW model=X6 addons=[c, a, b]}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.