Java 什么是;相互可比“;什么意思?

Java 什么是;相互可比“;什么意思?,java,collections,comparable,Java,Collections,Comparable,我读到: 每当需要对集合进行排序时,必须对元素进行排序 相互可比 我写了下面的代码,它工作正常。你能告诉我b类和c类是如何相互比较的,以及“相互比较”是什么意思吗 import java.util.ArrayList; 导入java.util.Collections; b类实现可比性{ 字符串str1; b(字符串str1){ 这个。str1=str1; } 公共整数比较(c对象){ 返回str1.compareTo(object.str1); } } c类实现了可比性{ 字符串str1; c(

我读到:

每当需要对集合进行排序时,必须对元素进行排序 相互可比

我写了下面的代码,它工作正常。你能告诉我b类和c类是如何相互比较的,以及“相互比较”是什么意思吗

import java.util.ArrayList;
导入java.util.Collections;
b类实现可比性{
字符串str1;
b(字符串str1){
这个。str1=str1;
}
公共整数比较(c对象){
返回str1.compareTo(object.str1);
}
}
c类实现了可比性{
字符串str1;
c(字符串str1){
这个。str1=str1;
}
公共整数比较(b对象){
返回str1.compareTo(object.str1);
}
}
公共a类{
公共静态void main(字符串[]args){
b obj1=新的b(“怪物”);
c obj2=新的c(“阿曼”);
ArrayList=新建ArrayList();
列表。添加(obj1);
列表。添加(obj2);
System.out.println(“未排序列表=“+list”);
集合。排序(列表);
System.out.println(“排序列表=“+list”);
}
}

这意味着对于集合中的任何两个项目,您必须能够比较A和B,反之亦然。

为了使类别
A
B
相互比较,需要满足以下要求:

  • 必须允许对
    A
    的实例调用
    compareTo
    ,传递
    B
    的实例
  • 必须允许对
    B
    的实例调用
    compareTo
    传递
    A
    的实例
  • 如果
    a.compareTo(b)
    返回
    x
    ,则
    b.compareTo(a)
    必须返回一个带有相反符号的值
    y
    ,或者当
    x
    为零时返回零
代码中的类不可相互比较,因为尝试将
c
的实例传递给
b
compareTo
(反之亦然)效果很好。但是,它们不能与它们自己的类的实例进行比较,如果要向集合中添加更多要排序的项,则会产生问题


为了使容器可排序,您的类还需要与其自身类型的实例相比较。

相互比较意味着两个类的实例必须与另一个类的实例相比较

对于类型
A
和类型
B

  • A
    必须实现
    compariable
    ,其中
    T
    扩展
    B
    (或is
    B
  • B
    必须实现
    compariable
    ,其中
    U
    扩展
    A
    (或is
    A
  • 比较必须是一致的。一致性意味着如果
    a>b
    那么它一定是这样的
    b您的代码只是偶然工作的,而且它有太多的错误,它们相互抵消,从而形成了工作代码

  • 您可以使用:
    ArrayList list=new ArrayList()
  • 如果一个类实现了
    Comparable
    T
    应该是该类的超级类型。例如,
    Integer实现类似的
    也可以
  • 这些要素必须相互可比

    这意味着该集合中的每个元素都必须彼此可比,并且在您的情况下,只有当您只添加了2个元素时才有效(添加更多元素将导致运行时ClassCastException)

    如果您想要一个同时包含
    B
    C
    的可排序集合,请查找这些类的公共父类(或者为其创建一个接口,让我们称之为
    BC
    ),然后您可以:

    class B implments BC, Comparable<BC> { ... }
    class C implments BC, Comparable<BC> { ... }
    
    否则,我们可以使用
    类D实现BC
    ,但不能使用
    可比的
    。有了这个新的注释,我们说“任何实现
    BC
    的东西都必须同时实现
    Comparable

    现在你只能写了

    class B implments BC { ... }
    class C implments BC { ... }
    

    (还请注意,您可以将
    getString()
    方法添加到接口
    BC
    ,以避免在比较方法中测试和强制转换的
    实例)

    这只是意味着可以使用某种“稳定”的比较函数将每个元素彼此进行比较。此外,如果
    A>B
    B>C
    A>C
    ,这一定是真的。但是类b和类C是相互可比的,这就是代码运行的原因correctly@user3519914看一看。我对代码印象深刻,但先生,我无法理解为什么会出现错误?理解原因,先生,感谢您强调这一点。@user3519914排序是以一种非常智能的方式完成的,因此很难说它将执行多少次比较。对四项进行排序时,三项为下限;可能还有更多。此外,没有必要将每个对象与其余的每个对象进行比较,因为
    sort
    依赖于比较的传递性(也就是说,如果
    a我对收藏不熟悉,那么请你解释一下编辑的含义以澄清它。那么根据你的说法,我的b类和c类是相互可比的吗?你的
    obj1
    obj2
    实例是相互可比的,但是你的
    b
    c
    类不是。请参见编辑后的答案ting是否每两个实例都检查所有3个条件?对不起,先生,我知道这段代码有很多错误,但我必须这样编写才能使其正常工作。没问题。在大多数情况下,您只有
    类Foo实现Comparable
    ,然后
    ArrayList
    。相互比较只是意味着
    Foo
    可以比较d到另一个
    foo
    。先生,我通过实现BC尝试了正确的方法,但我的代码不起作用。您能告诉我必要的更正吗原始解决方案不起作用,谢谢注意。我已相应地编辑了答案。
    obj1.compareTo(obj2); // This is valid, b implements Comparable<c>
    obj2.compareTo(obj1); // This is also valid, c implements Comparable<b>
    
    obj1.compareTo(obj1); // This is NOT valid! b does not implement Comparable<b>
    
    class B implments BC, Comparable<BC> { ... }
    class C implments BC, Comparable<BC> { ... }
    
     interface BC extends Comparable<BC> { }
    
    class B implments BC { ... }
    class C implments BC { ... }