在 java 中覆盖 "equals()" 方法的任何替代方法?
any alternative to overriding "equals()" method in java?
我有几个非常大的对象数组列表,我想找到它们的对称差异(或析取)。为此,我决定使用 Sets 及其 "contain()" 方法。但是,此方法使用 equals() 方法来评估所述对象。
问题是,我无法对 class 进行任何更改。所以,我不能覆盖任何方法。 (我的代码只是一个非常大的项目的一小部分)
所以这让我留在这里,除了改变 classes 本身还有其他选择吗?或任何其他不需要我对 classes 进行任何更改的方式?
我最终使用了包装器 class,最初由 "Oliver Charlesworth" 和评论中的其他人建议。
我最近发现了这一点,所以我有一个替代解决方案(仅适用于 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()));
起初有点混乱,但您不必再创建了 类。
我有几个非常大的对象数组列表,我想找到它们的对称差异(或析取)。为此,我决定使用 Sets 及其 "contain()" 方法。但是,此方法使用 equals() 方法来评估所述对象。 问题是,我无法对 class 进行任何更改。所以,我不能覆盖任何方法。 (我的代码只是一个非常大的项目的一小部分)
所以这让我留在这里,除了改变 classes 本身还有其他选择吗?或任何其他不需要我对 classes 进行任何更改的方式?
我最终使用了包装器 class,最初由 "Oliver Charlesworth" 和评论中的其他人建议。
我最近发现了这一点,所以我有一个替代解决方案(仅适用于 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()));
起初有点混乱,但您不必再创建了 类。