2011-12-15 72 views
0

我正在使用java.util.concurrent.ConcurrentSkipListSet。我定义了一个类别People,其对象保存在ConcurrentSkipListSet<People>,Comparator<People>比较AgePeople中,并且ConcurrentSkipListSet<People>对象通过此Comparator<People>构建。Java:Comparator(a,b)== 0为ConcurrentSkipListSet时会发生什么?

如果我有具有相同Age 2个People对象,例如a.Age.equals(b.Age),会发生什么? abConcurrentSkipListSet?还是只有一个?

它需要这样的Comparator必须与一致等于,但对我来说,a.Age.equals(b.Age)绝对不等于a.equals(b)。我只想通过AgePeople对象进行排序。

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; 
    } 

如果我不定义rv = 0,程序冥冥中似乎被卡住,不会终止:现在

如下我的比较器来实现。所以我已经定义了它?为什么?

+0

@gurung你为什么斜体代码样本?为什么有些但不是全部? – corsiKa 2011-12-15 20:05:58

+0

@ toto2大减1.不要在比较中采取减法的快捷方式。 http://stackoverflow.com/questions/2728793/java-integer-what-is-faster-comparison-or-subtraction – corsiKa 2011-12-15 22:17:32

回答

2

与等号一致仅仅意味着a.equals(b)(而不是== ...)意味着a.compareTo(b) == 0。而已。

在排序而言,这意味着你有一个范围相等的值的范围内的未定义命令。

我还要指出的是,根据java.util.Comparator的Javadoc,

这是一般的情况,但并不严格要求(比较(X,Y)== 0)==(X。等于(Y))。

虽然通常可以假定情况是这样,除非另有证明。 (你承担多大的商业风险取决于你。)

0

我认为这是一个模拟点,因为你不能使用Comparator<Age>ConcurrentSkipListSet<People>。见javadoc,这表明Age必须是People一个超和我想象它不是。

相关问题