这个比较器课程如何工作?

时间:2015-09-23 10:57:03

标签: java hibernate comparator sortedset

我在这个站点找到了这个比较器类。

Hibernate - SortedSet Mappings

但我无法理解它是如何运作的.. 任何想法??

import java.util.Comparator;

public class MyClass implements Comparator<Certificate>{
   public int compare(Certificate o1, Certificate o2) {
      final int BEFORE = -1;
      final int AFTER = 1;

      /* To reverse the sorting order, multiple by -1 */
      if (o2 == null) {
         return BEFORE * -1;
      }

      Comparable thisCertificate = o1.getName();
      Comparable thatCertificate = o2.getName();

      if(thisCertificate == null) {
         return AFTER * 1;
      } else if(thatCertificate == null) {
         return BEFORE * -1;
      } else {
         return thisCertificate.compareTo(thatCertificate) * -1;
      }
   }
}

2 个答案:

答案 0 :(得分:3)

此比较器完全不起作用,因为它违反了Comparator工作原理的最基本rules

  

实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))

{p> Comparator.compare(x , y) == -Comparator.compare(y,x)在使用xynullMyClass时无效。

  

(这意味着当且仅当compare(y,x)抛出异常时,compare(x,y)必须抛出异常。)

案例o1 == null根本没有处理,因此会抛出异常,而案例o2 == null则不会。

这远远不是一个工作的比较器看起来像什么,并且最终可以看作是一个非常难看的黑客。 此Comparator仅适用于非null的值。在这种情况下,它只是与自然顺序相反。

答案 1 :(得分:0)

有效吗?在文档中说它正在进行反向排序,

  

如果我们使用sort =“natural”设置,那么我们不需要创建一个单独的类,因为Certificate类已经实现了Comparable接口,而hibernate将使用Certificate类中定义的compareTo()方法来比较证书名称。但是我们在映射文件中使用自定义比较器类MyClass,因此我们必须根据排序算法创建此类。 让我们使用此类在此课程中进行降序排序。

据我所知,似乎不是真的正确......除非两个证书名称都正确。

public int compare(Certificate o1, Certificate o2) {
  final int BEFORE = -1;
  final int AFTER = 1;

  /* To reverse the sorting order, multiple by -1 */
  if (o2 == null) {       // if o2 = null > o1 goes first
     return BEFORE * -1;  // -1 * -1 = 1 so o1 goes first
  }

  Comparable thisCertificate = o1.getName();  // get o1 name to compare
  Comparable thatCertificate = o2.getName();  // get o2 name to compare

  if(thisCertificate == null) {         // if o1 name is null, o2 goes first
     return AFTER * 1;                  // 1 * 1 = 1 > o1 goes first
  } else if(thatCertificate == null) {  // if o2 name is null, o1 goes first
     return BEFORE * -1;                // -1 * -1 = 1 > o1 goes first
  } else {                              
     // if both certs names are valid compare them in the usual way 
     //  sorting inversed because of the -1.
     return thisCertificate.compareTo(thatCertificate) * -1;
  }
}