gpt4 book ai didi

java - 如何使用自定义相等性过滤列表

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

我有一个对象列表。对象看起来类似于这个:

class Data {

...

private X somethig;
private Y somethigElse;

public boolean customEquals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Data)) {
return false;
}
Data other = (Data) obj;
if (something == null) {
if (other.something != null) {
return false;
}
} else if (!something.equals(other.something)) {
return false;
}
if (somethigElse == null) {
if (other.somethigElse != null) {
return false;
}
} else if (!somethigElse.equals(other.somethigElse)) {
return false;
}
return true;
}

public boolean equals(Object obj) {
...
}

public int hashCode() {
...
}

getters/setters

}

我需要过滤列表以从中获取不同的对象。

请注意 equals 和 hashCode 方法已实现(它们使用其他字段),我不能使用 equals 来完成此任务。因此,相等性不是由 equals 定义的,而是由“something”和“somethigElse”属性定义的。我该怎么做?

我试过:

final Comparator<Data> comparator = new Comparator<Data>() {

@Override
public int compare(Data o1, Data o2) {
return o1.customEquals(o2) ? 0 : 1;
}
};
Set<Data> set = new TreeSet<Data>(comparator);
set.addAll(list);
System.out.println(set);

但该集合仍然多次包含某些对象。

最佳答案

那是因为您没有提供正确的排序功能。

TreeSet 排序算法做出一些假设,例如:

compare(a, b) > 0 => compare(b, a) < 0
compare(a, b) > 0 && compare(b, c) > 0 => compare(a, c) > 0

等等。

实现适当的比较,而不仅仅是“等于”,它应该有效。

final Comparator<Data> comparator = new Comparator<Data>() {

@Override
public int compare(Data o1, Data o2) {
int k = o1.getSomething().compareTo(o2.getSomething();
if (k != 0) {
return k;
}
return o1.getSomethingElse() - o2.getSomethingElse();
}
};

那是因为 TreeSet 是一个 SortedSet,并且您是在告诉每个到达的新元素都比其他元素大,但它本身更大。

让我们做一个简化,用一个更短的例子来说明发生了什么,假设我们只使用数字和你的比较器,存储是一个数组(和二进制搜索)而不是树,因为它更容易表示。

我们得到了数字 1,它是唯一的元素,所以数组现在是 [1]

我们现在得到一个 0,但是当你告诉集合它更大时,我们得到 [1, 0]

例如,我们现在添加一个 3,我们将得到 [1, 0, 3]

再添加一个1,二分法会尝试将它与中间元素0进行比较,看到它更大,转到另一半,与进行比较>3 并且它再次变大,所以我们得到 [1, 0, 3, 1]

如果我们添加另一个 1,现在它会看到该元素已经存在并且不会添加它,但是如果您添加任何其他数字并且碰巧它的重复不在任何的二分点,它总是会在数组的末尾结束。

关于java - 如何使用自定义相等性过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17970565/

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