我正在使用java.util.concurrent.ConcurrentSkipListSet
。我定义了一个类People
,其对象保存在ConcurrentSkipListSet<People>
,Comparator<People>
比较Age
People
,并构造ConcurrentSkipListSet<People>
个对象通过这个Comparator<People>
。
如果我有两个具有相同People
的{{1}}个对象,例如Age
,会发生什么? a.Age.equals(b.Age)
中的a
和b
都是?或者只有一个?
这样的ConcurrentSkipListSet
必须与equals 一致,但就我而言, Comparator
绝对不是 > a.Age.equals(b.Age)
的。我只想按a.equals(b)
对People
个对象进行排序。
现在我的比较器实现如下:
Age
如果我没有定义 class ComparatorHSD implements Comparator<People> {
public int compare(People s0, People s1) {
int rv = 0;
if (s0.Age > s1.Age) {
rv = 1;
} else if (s0.Age < s1.Age) rv = -1;
return rv;
}
,那么该程序似乎停留在某处并且不会终止。所以我定义了它?为什么呢?
答案 0 :(得分:2)
与equals一致只是意味着a.equals(b)
(不是==
...)意味着a.compareTo(b) == 0
。就是这样。
就排序而言,这意味着您在一个相等的值范围内有一个未定义的顺序。
我还应该注意到,根据java.util.Comparator
的javadoc,
通常情况如此,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。
虽然通常可以假设情况属实,除非另有说明。 (你对这个假设有多大的商业风险取决于你。)
答案 1 :(得分:0)
我认为这是一个没有实际意义的点,因为您无法将Comparator<Age>
与ConcurrentSkipListSet<People>
一起使用。请参阅javadoc,其中显示Age
必须是People
的超类型,我想它不是。