【问题标题】:how does compareTo and compare work?compareTo 和 compare 是如何工作的?
【发布时间】:2012-09-12 10:23:59
【问题描述】:

我知道比较和compareTo 返回一个int 值。

例如:

Returns
0 if a equal b
-1 if a < b
+1 if a > b

sort 方法调用compareTocompare() 方法。但是sort 方法在比较时如何安排listcompareTo 返回一个int 值。在comparecompareTo 返回一个int 值进行排序后运行的后台场景是什么?sort 方法如何利用从@ 返回的int 值(-101) 987654339@和compareTo

【问题讨论】:

标签: java


【解决方案1】:

如果被比较的两个元素 (a,b) 的顺序已经正确,compare(a, b)a.compareTo(b) 都会返回一个值 &lt;= 0,因此不会发生任何事情。

如果顺序不对,返回值为&gt; 0,表示必须互换。

【讨论】:

  • +1 最佳答案 IMO,考虑到您实际上回答了 OP 的问题,而不仅仅是复制和粘贴文档。
【解决方案2】:

一般案例排序算法基于比较。如果您比较 ab - 恰好有 3 种可能性:a == ba &gt; ba &lt; b

compare()compareTo() 方法正好提供了这些信息。

现在,为了使用这些信息,我们设计了许多 sorting algorithms,从幼稚的 bubble sort 开始,还有一些是更先进的,例如 quick sort。每个都为排序问题提供了不同的方法。

Java 为其排序实现选择了TimSort 算法。

作为练习,您可以设计自己的1 排序算法。你能使用compare() 方法找到数组的最大元素吗?当你找到它时它应该在哪里?下一步该怎么做?


(1) 好吧,你自己想想,其实它已经存在了:)

【讨论】:

    【解决方案3】:

    阅读this document

    • a.compareTo(b):
      可比的界面。比较值并返回一个 int,它告诉值比较小于、等于还是大于。 如果您的类对象具有自然顺序,请实现 Comparable 接口并定义此方法。所有具有自然排序的 Java 类都实现了这一点(String、Double、BigInteger,...)。

    • compare(a, b):
      比较器接口。比较两个对象的值。这是作为 Comparator 接口的一部分实现的,典型用途是定义一个或多个实现此功能的小型实用程序类,以传递给诸如 sort() 之类的方法或供对诸如 TreeMap 和 TreeSet 之类的数据结构进行排序使用。您可能希望为以下内容创建一个 Comparator 对象:

      • 多重比较。提供几种不同的排序方式。例如,您可能希望按名称、ID、年龄、身高等对 Person 类进行排序……您可以为每个类定义一个 Comparator 以传递给 sort() 方法。
      • 系统类 为您无法控制的类提供比较方法。例如,您可以为字符串定义一个比较器,按长度进行比较。
      • 策略模式 实现策略模式,在这种情况下,您希望将算法表示为可以作为参数传递、保存在数据结构中等的对象。

    【讨论】:

      【解决方案4】:

      希望 compare() 方法的这些实现可以帮助您更好地理解它。

      public int compare(Object obj1, Object obj2)
      {
       Integer I1 = (Integer)obj1; // typecasting object type into integer type
       Integer I2 = (Integer)obj2; // same as above ..
       // 1.
       return I1.compareTo(I2); // ascending order [0, 5, 10, 15, 20]
       // 2.
       return -I1.compareTo(I2); // descending order [20, 15, 10, 5, 0]
       // 3.
       return I2.compareTo(I1); // descending order [20, 15, 10, 5, 0]
       // 4.
       return -I2.compareTo(I1); // ascending order [0, 5, 10, 15, 20]
       // 5.
       return +1; // insertion order [10, 0, 15, 5, 20, 20]
       // 6.
       return -1; // reverse of insertion order [20, 20, 5, 15, 0, 10]
       // 7.
       return 0; // only first element [10]
      }
      

      How compare() method works in Java

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多