gpt4 book ai didi

java - 在 Java 中覆盖 "equals()"方法的任何替代方法?

转载 作者:行者123 更新时间:2023-11-30 10:40:29 24 4
gpt4 key购买 nike

我有几个非常大的对象数组列表,我想找到它们的对称差异(或析取)。为此,我决定使用 Sets 及其“contain()”方法。但是,此方法使用 equals() 方法来评估所述对象。问题是,我无法在类里面进行任何更改。所以,我不能覆盖任何方法。 (我的代码只是一个非常大的项目的一小部分)

所以这让我留在这里,除了改变类本身还有其他选择吗?或者任何其他不需要我对我的类(class)进行任何更改的方式?

最佳答案

我最近发现了这一点,所以我有一个替代解决方案(仅适用于 Java 8):

// Being T the class of the objects in the list
ArrayList<T> list1 = ...;
ArrayList<T> list2 = ...;

// A function to compare two elements
BiFunction<T, T, Boolean> funcEquals = (a,b) -> yourEquals(a,b);
// A function that given a List returns a predicate that states if an element is on that list
Function<List<T>, Predicate<T>> notIn = (s) -> (e) -> s.stream().filter((y) -> funcEquals.apply(e, y)).count() == 0;

// Get the elements in list1 that are not in list2
Stream<String> list1Filtered = list1.stream().filter(notIn.apply(list2));
// Get the elements in list2 that are not in list1
Stream<String> list2Filtered = list2.stream().filter(notIn.apply(list1));
/*
If you have more than two lists, comparisons can be concatenated:
Stream<String> list1Filtered = list1.stream().filter(notIn.apply(list2)).filter(notIn.apply(list3));
Stream<String> list2Filtered = list2.stream().filter(notIn.apply(list1)).filter(notIn.apply(list3));
Stream<String> list3Filtered = list3.stream().filter(notIn.apply(list1)).filter(notIn.apply(list2));
*/

// Add them all together
ArrayList<T> result = new ArrayList<T>();
result.addAll(list1Filtered.collect(Collectors.toList()));
result.addAll(list2Filtered.collect(Collectors.toList()));

起初有点困惑,但您不必再创建任何类。

关于java - 在 Java 中覆盖 "equals()"方法的任何替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38892388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com