假设我有一个实现IComparable的类型。我原以为运算符==是合理的,!=,>,,>=和会通过调用CompareTo自动“正常工作”,但如果我想使用它们,我必须覆盖它们。从语言设计的角度来看,这样做有充分的理由吗?在任何情况下它对A>B真的有用吗?表现与Compare(A,B)>0不同? 最佳答案 整个情况令人烦恼。C#有太多表达相等和不相等的方式:==!=>=Equals静态方法(调用虚方法)、Equals虚方法、ReferenceEquals方法IComparable和IEquatable接口(interface)它们都有微
假设我有一个实现IComparable的类型。我原以为运算符==是合理的,!=,>,,>=和会通过调用CompareTo自动“正常工作”,但如果我想使用它们,我必须覆盖它们。从语言设计的角度来看,这样做有充分的理由吗?在任何情况下它对A>B真的有用吗?表现与Compare(A,B)>0不同? 最佳答案 整个情况令人烦恼。C#有太多表达相等和不相等的方式:==!=>=Equals静态方法(调用虚方法)、Equals虚方法、ReferenceEquals方法IComparable和IEquatable接口(interface)它们都有微
Comparable接口的compareTo方法的升序或降序取决于实现该接口的类的具体实现。按照惯例,compareTo方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说:如果this对象小于传入的对象,则compareTo应该返回负数。如果this对象等于传入的对象,则compareTo应该返回零。如果this对象大于传入的对象,则compareTo应该返回正数。通常情况下,这样的实现会使compareTo方法按照升序排序。但是,你也可以通过在返回语句中反转比较结果来实现降序排序。这完全取决于具体的实现。单字段排序下面是一个示例,演示了一个自定义类Person实
我最近在SO聊天中看到了一个讨论,但没有明确的结论,所以我最终在那里问了。这是出于历史原因还是与其他语言的一致性?查看各种语言的compareTo的签名时,返回一个int。为什么它不返回枚举。例如在C#中我们可以这样做:enumCompareResult{LessThan,Equals,GreaterThan};和:publicCompareResultCompareTo(Employeeother){if(this.Salary在Java中,枚举是在这个概念之后引入的(我不记得关于C#),但它可以通过一个额外的类来解决,例如:publicfinalclassCompareResult
我最近在SO聊天中看到了一个讨论,但没有明确的结论,所以我最终在那里问了。这是出于历史原因还是与其他语言的一致性?查看各种语言的compareTo的签名时,返回一个int。为什么它不返回枚举。例如在C#中我们可以这样做:enumCompareResult{LessThan,Equals,GreaterThan};和:publicCompareResultCompareTo(Employeeother){if(this.Salary在Java中,枚举是在这个概念之后引入的(我不记得关于C#),但它可以通过一个额外的类来解决,例如:publicfinalclassCompareResult
我知道compare和compareTo返回一个int值。例如:Returns0ifaequalb-1ifabsort方法调用compareTo或compare()方法。但是sort方法在compare或compareTo返回int值时如何排列list。compare或compareTo返回一个int值进行排序后运行的后台场景是什么?sort方法如何利用int值(-1或0或1)从compare和compareTo 最佳答案 如果被比较的两个元素(a,b)的顺序已经正确,compare(a,b)和a.compareTo(b)两者都返回
我知道compare和compareTo返回一个int值。例如:Returns0ifaequalb-1ifabsort方法调用compareTo或compare()方法。但是sort方法在compare或compareTo返回int值时如何排列list。compare或compareTo返回一个int值进行排序后运行的后台场景是什么?sort方法如何利用int值(-1或0或1)从compare和compareTo 最佳答案 如果被比较的两个元素(a,b)的顺序已经正确,compare(a,b)和a.compareTo(b)两者都返回
EDIT3:使用StringComparercomparer1=StringComparer.Ordinal;而不是IComparablevIComparablewcomparer1.Compare(v,w)解决了运行时问题。我在Java和C#中对排序算法(例如Quicksort、Mergesort)做了一些基准测试。我使用Java7和.NETFramework4.5来实现和执行我的算法。它表明所有算法都可以使用Java实现更好的运行时。快速排序的一些示例运行时:C#n=10000004433毫秒n=200000010047毫秒Javan=10000001311毫秒n=20000003
EDIT3:使用StringComparercomparer1=StringComparer.Ordinal;而不是IComparablevIComparablewcomparer1.Compare(v,w)解决了运行时问题。我在Java和C#中对排序算法(例如Quicksort、Mergesort)做了一些基准测试。我使用Java7和.NETFramework4.5来实现和执行我的算法。它表明所有算法都可以使用Java实现更好的运行时。快速排序的一些示例运行时:C#n=10000004433毫秒n=200000010047毫秒Javan=10000001311毫秒n=20000003
以下小测试引发NPE:publicclassTest{publicstaticvoidmain(String[]args){Stringa="a";Stringb=null;System.out.println(a.compareTo(b));}}然而,compareTo()的Javadoc没有提到参数不能为null。这很奇怪,因为Javadocs通常会提到参数不能为null。这只是文档中的一个小故障,还是我缺少更根本的原因/扭曲? 最佳答案 您可以在查看Comparable时得到一些解释。界面:Notethatnullisnota