我写UT如下。为什么大小因同一比较而不同
public void testComparatorRandom2() {
Random random = new Random();
class CCC implements Comparator<EventLoad>{
@Override
public int compare(EventLoad o1, EventLoad o2) {
if (o1.getEventId() == o2.getEventId())
return 0;
if (o1.getLoad() > o2.getLoad())
return -1;
if (o1.getLoad() < o2.getLoad())
return 1;
if (o1.getEventId() > o2.getEventId())
return 1;
if (o1.getEventId() < o2.getEventId())
return -1;
throw new RuntimeException("error");
}
}
Set<EventLoad> eventSet = new TreeSet<EventLoad>(new CCC());
SortedSet<EventLoad> sortedEventLoads = new ConcurrentSkipListSet<EventLoad>(new CCC());
for (int i = 0; i < 10000; i++) {
EventLoad newEventLoad = new EventLoad(random.nextInt(RANDOM_NUM), random.nextInt(RANDOM_NUM)) ;
newEventLoad.setLoad(random.nextInt(RANDOM_NUM));
eventSet.add(newEventLoad);
sortedEventLoads.add(newEventLoad);
System.out.println(eventSet.size()+"=== "+newEventLoad+"======="+sortedEventLoads.size());
if (eventSet.size() != sortedEventLoads.size()) {
System.out.println(eventSet.size()+"=== "+eventSet+"======="+sortedEventLoads.size() +"====="+sortedEventLoads);
//Failed
}
}
AssertResult(sortedEventLoads, eventSet);
}
我的等于方法如下。那是对的吗? Eventid是EventLoad的一个属性。
public boolean equals(Object object) {
if (this == object)
return true;
if (!getClass().isInstance(object))
return false;
EventLoad other = (EventLoad) object;
return _eventId == other._eventId;
}
顺便说一句。在添加之前,我可以使用contains,并且行为仍然不同。
答案 0 :(得分:0)
你的比较器完全坏了,因此所有有序集的行为都是未定义的。
(如果你要求它对a,b和b进行排序,那么在说出之前的内容是不一致的。)
答案 1 :(得分:0)
根据目前的研究,我们发现比较是不正确的,因为它不遵循A&gt; B&amp;&amp; B> C然后A> C. e.g:
A Load 8, Event 10.
B Load 2, Event 8
C Load 1, Event 10;
A>B true;
B>C true;
A>C false
A=C;
这就是为什么失败了。