2016-05-21 48 views
1

首先这是一个学术问题,所以我们不要担心练习是否良好。 假设我们有一个TreeSet<"Object">,我们想用比较器实例化它。这个比较器将返回通常的0,-1和1,但前提是两个对象是相同的类。因此,当对象属于不同的类别并且比较它们没有意义时,比较器应该返回什么? -1或1?还是比较合同要求我指定所有情况下的订单,如果我不想抛出运行时异常?比较器的最佳做法当项目不能进行逻辑比较时

回答

2

A Comparator必须指定它可能接收的所有可能值之间的顺序。您不能有两个对象,这些对象可能是您的数据结构的一部分,Comparator无法“处理”。如果比较它们是没有意义的,那么就做出一个任意的决定。例如,如果他们是同一类的没有,只是比较类名:

if (!a.getClass().equals(b.getClass()) { 
    return a.getClass().getName().compare(b.getClass().getName()); 
} 
+0

所以我猜这个合同是,如果我要创建一个比较我必须为所有可能的输入顺序,如果我不想抛出异常。 –

+1

@FaiLau yup,并且该顺序需要一致。也就是说,对于每个'a'和'b',如果'a.compareTo(b)<0',它必须暗示'b.compareTo(a)> 0'并且如果'a.compareTo(b)= 0',它必须暗示'b.compareTo(a)= 0'。 – Mureinik