当前位置: 首页 > 知识库问答 >
问题:

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

倪鸿禧
2023-03-14

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

返回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:比较方法违反了它的一般约定!

共有3个答案

潘自强
2023-03-14

如果一个染色体的得分大于另一个染色体,那么你要实现的似乎是一个染色体比另一个大。不幸的是,这没有提供明确的优先级。一、 你不能保证每个o1=o2和o2=o3o1=o3都是真的。这可能会导致一个无休止的排序循环,或者,使用更高级的算法,您面临的例外。因此,您需要找到另一种提供稳定排序的算法。

方法是:

    < li >比较分数总和 < li >定义分数优先级(仅当分数1相等时比较分数2,依此类推)
柴琨
2023-03-14

稍微阐述一下罗顿爵士的回答:

比较方法应遵循两个属性:

    < li >比较是对称的,即如果< code>A=B则< code>B=A且如果< code>A

第一个属性符合您的比较条件,但第二个属性不符合。考虑投票理论中的以下例子:我们有3个人,他们投票支持3个备选方案。排名最高的备选方案获胜。众所周知,这可能会导致一种模棱两可的局面,没有其他选择获胜。

在你的例子中,分数是人,染色体是替代物。我没有用5个分数,而是只用3个,因为这足以说明问题。我有3条染色体,ABC,分数如下:

A: 1, 2, 3
B: 2, 3, 1
C: 3, 1, 2

不难看出A

你可以通过按字典顺序排列染色体来解决这个问题:

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

房泉
2023-03-14

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

int compare(Chromosome o1, Chromosome o2)

然而,似乎在您的情况下实现更合适的接口是可以比较的。http://docs . Oracle . com/javase/7/docs/API/Java/lang/comparable . html

int compareTo(Chromosome o)

Comparable通常实现为类的实例提供自然的排序。Comparator通常是一个与您要比较的内容不同的类,可以用于为您提供几种不同类型的排序。

不管您实现的是什么,该类也需要被类型化:

class Chromosome implements Comparable<Chromosome> 

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

 类似资料:
  • 我从上面得到了一个例外,我知道这里经常讨论SO。无论如何,其他人不会告诉我我的代码有什么问题。这些只是音乐专辑返回最后一首歌曲被添加到Android的MediaStore的时间,以毫秒为单位。这只在某些设备上发生! 代码:

  • 我已经在类上实现了Comaprable,它给了我比较方法违反了它的总合同!,由于有一些值返回为 null,代码如下 公共静态比较器名称比较器 = 新比较器() {

  • 本文向大家介绍Javascript的比较汇总,包括了Javascript的比较汇总的使用技巧和注意事项,需要的朋友参考一下 在Javascript应用过程中会遇到各式各样的比较,今天给大家整理了三种情况,一起来学习下。 1.两个对象的比较 Javascript的比较中参杂了一些比较奇怪的特性,我们来看一些比较简单的比较。 由上面的结果可以看出比较两个原始值跟比较对象规则似乎有点不同,比较两个对象值

  • 我刚刚读了应用程序架构指南。在这篇文章中,google演示了使用新的android架构组件构建健壮的android应用程序的基本指南。如今年的Google I/O所示,一个应用程序应该有4层: 在这种情况下,依赖关系从上到下流动,较高层只知道直接位于它们下面的组件,例如。UI控制器只知道ViewModel,ViewModel只知道存储库等。 因此,我观看了视频,完成了相应的codelabs,然后学

  • 我试图使用比较器基于两个字符串的比较对数组列表进行排序,但我最终使用的比较方法违反了它的一般契约错误。如果字符串中出现空值比较,我该如何处理? 密码 错误

  • 我试图按价格对项目进行排序,但每个项目都属于一个类别,因此我必须创建一个以类别为键、以项目为值的地图,并且我必须使用class对其进行排序。 这是比较器类 这就是地图 我不知道如何在这张地图上按价格对物品进行分类。