在java中覆盖“equals()”方法的任何替代方法?

时间:2016-08-11 09:26:46

标签: java arraylist equals

我有几个非常大的对象ArrayLists,我想找到它们的对称差异(或析取)。为此,我决定使用Sets及其“contains()”方法。但是,此方法使用equals()方法来计算所述对象。 问题是,我不能在班上做任何改动。所以,我不能覆盖任何方法。 (我的代码只是一个非常大的项目的一小部分)

所以这让我离开这里,还有其他替代改变类本身吗?或任何其他方式不需要我对我的课程进行任何更改?

2 个答案:

答案 0 :(得分:1)

我最近发现了这个,所以我有一个替代解决方案(仅适用于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()));

一开始有点混乱,但你不必再创建任何课程。

答案 1 :(得分:0)

我最终使用了一个包装类,最初由“Oliver Charlesworth”和评论中的其他人提出。