Java 如何使比较法尊重总承包合同?

Java 如何使比较法尊重总承包合同?,java,compare,compareto,contract,Java,Compare,Compareto,Contract,染色体包含许多以不同方式生成的分数。 compareTo方法实际上测试方法的一致性,并相应地返回结果 返回1:comp=-5..-1 返回0:comp=0(可能发生在不同的场景中,其中之一是所有分数相等 返回-1:comp=1..5 public int compareTo(Chromosome o) { if(o == null) return(1); int comp = 0; comp += Double.compare(getScore(1),o.

染色体包含许多以不同方式生成的分数。 compareTo方法实际上测试方法的一致性,并相应地返回结果

返回1:comp=-5..-1

返回0:comp=0(可能发生在不同的场景中,其中之一是所有分数相等

返回-1:comp=1..5

public int compareTo(Chromosome o) {
    if(o == null)
        return(1);
    int comp = 0;
    comp += Double.compare(getScore(1),o.getScore(1));
    comp += Double.compare(getScore(2),o.getScore(2));
    comp += Double.compare(getScore(3),o.getScore(3));
    comp += Double.compare(getScore(5),o.getScore(5));
    comp += Double.compare(getScore(7),o.getScore(7));
    if(comp == 0)
        return(0);
    if(comp > 0)
        return(1);
    else
        return(-1);
}
我的问题是,如何使这个场景遵守合同为客户规定的规则。 显然不是这样,我一直得到:
java.lang.IllegalArgumentException:Comparison方法违反了它的一般约定!

如果您正在实现Comparator接口,那么您需要使用此方法(假设您的类是带有染色体tpye的泛型):

但是,在您的案例中,似乎更适合实现的接口具有可比性

Comparable通常用于为类的实例提供自然排序。Comparator通常是一个单独的类,用于为您提供几种不同类型的排序

无论您正在实现什么,都需要键入该类:

class Chromosome implements Comparable<Chromosome> 

否则,参数应该是对象,而不是染色体。

如果一条染色体的分数大于另一条染色体的分数,那么您尝试实现的参数似乎大于另一条染色体。不幸的是,这没有提供明确的优先级。即,您不能保证每个o1=o2和o2=o3 o1=o3都是真的。这是错误的ht会导致无止境的排序循环,或者使用一种更高级的算法来解决您面临的问题。因此,您需要找到另一种算法来提供稳定的排序

方法是:

  • 比较分数之和
  • 定义分数优先级(只有分数1相等时才会比较分数2,依此类推)

  • 请详细说明一下罗顿爵士的回答:

    compareTo
    方法应遵循两个属性:

    • 比较是对称的,即如果
      A=B
      那么
      B=A
      和如果
      AA

    • 比较是可传递的,也就是说,如果“谢谢你”,1)似乎就是我在做的事情,不是吗?我将个人比较的结果加起来,这应该是直截了当的,但似乎并不像预期的那样有效。@jallmer,这真的取决于你的要求。顺序是重要的还是你只是想要一些任意的顺序?完美的顺序不是至关重要的,但它应该有点有序。@jallmer然后你可以先把每个染色体的所有分数相加,然后比较两个和,但请注意,你可能有许多对被认为是相等的(即,比较结果为0)嗯,分数并不是真的相加。我在加上比较的结果,这不应该导致类似的行为吗?@jallmer不幸的是,正如我们从反例中看到的那样。你尝试在高维空间中比较2个点。加上它们基本上会比较曼哈顿距离与原点的距离。你还可以将平方和相加res,然后取每个分数的平方根,以获得到原点的欧几里德距离,但这可能也没有帮助。我会提出一个字典顺序。我会用一个代码示例更新我的答案。比较器遵守相同的契约吗?我想是的,除了它们是不同方法,使用不同的方法之外签名。在这两种情况下,您都应该与equals()保持一致,尽管根据JavaDoc这不是一个严格的要求。还建议比较器实现Serializable。此外,两者都应该为null抛出NullPointerException。是否可以调用旧版本的Collection.sort,而不要求用户在某些java.ini中设置某种标志?是否可以你会让JVM忽略合同吗?
      int compareTo(Chromosome o)
      
      class Chromosome implements Comparable<Chromosome> 
      
      A: 1, 2, 3
      B: 2, 3, 1
      C: 3, 1, 2
      
      public int compareTo(Chromosome o) {
          if(o == null)
              return(1);
          int[] indices = {1, 2, 3, 5, 7};
          for (int i : indices) {
              int c = Double.compare(getScore(i),o.getScore(i));
              if (c != 0)
                  return c;
          }
          return 0;
      }