Java 什么是;相互可比“;什么意思?
我读到: 每当需要对集合进行排序时,必须对元素进行排序 相互可比 我写了下面的代码,它工作正常。你能告诉我b类和c类是如何相互比较的,以及“相互比较”是什么意思吗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(
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
(或isB
)B
必须实现B
,其中compariable
扩展U
(或isA
)A
- 比较必须是一致的。一致性意味着如果
那么它一定是这样的a>b
b您的代码只是偶然工作的,而且它有太多的错误,它们相互抵消,从而形成了工作代码
- 您可以使用:
ArrayList list=new ArrayList()代码>
- 如果一个类实现了
这些要素必须相互可比 这意味着该集合中的每个元素都必须彼此可比,并且在您的情况下,只有当您只添加了2个元素时才有效(添加更多元素将导致运行时ClassCastException) 如果您想要一个同时包含
,Comparable
应该是该类的超级类型。例如,T
也可以Integer实现类似的
和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
,这一定是真的。但是类b和类C是相互可比的,这就是代码运行的原因correctly@user3519914看一看。我对代码印象深刻,但先生,我无法理解为什么会出现错误?理解原因,先生,感谢您强调这一点。@user3519914排序是以一种非常智能的方式完成的,因此很难说它将执行多少次比较。对四项进行排序时,三项为下限;可能还有更多。此外,没有必要将每个对象与其余的每个对象进行比较,因为A>C
依赖于比较的传递性(也就是说,如果sort
a我对收藏不熟悉,那么请你解释一下编辑的含义以澄清它。那么根据你的说法,我的b类和c类是相互可比的吗?你的
和obj1
实例是相互可比的,但是你的obj2
和b
类不是。请参见编辑后的答案ting是否每两个实例都检查所有3个条件?对不起,先生,我知道这段代码有很多错误,但我必须这样编写才能使其正常工作。没问题。在大多数情况下,您只有c
,然后类Foo实现Comparable
。相互比较只是意味着ArrayList
可以比较d到另一个Foo
。先生,我通过实现BC尝试了正确的方法,但我的代码不起作用。您能告诉我必要的更正吗原始解决方案不起作用,谢谢注意。我已相应地编辑了答案。foo
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 { ... }
- 您可以使用: