28

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

例如:

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

sort方法调用其中一个compareTocompare()方法。但是sort方法如何安排list比较或compareTo返回int值。compare在 a或返回要排序的 int 值之后运行的后台场景是什么compareTosort方法如何使用从and返回给它的 int 值(-10或)1comparecompareTo

4

4 回答 4

27

如果被比较的两个元素 (a,b) 的顺序已经正确,compare(a, b)并且a.compareTo(b)都返回一个值<= 0,那么就不必发生任何事情。

如果它们的顺序不正确,则返回值为> 0,表示它们必须互换。

于 2012-09-13T04:26:24.200 回答
4

一般案例排序算法基于比较。如果你比较ab- 正好有 3 种可能性:a == b, a > b, a < b.

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

现在,为了使用这些信息,我们设计了许多排序算法,从简单的冒泡排序开始,还有一些更先进的排序算法,例如快速排序。每个都为排序问题提供了不同的方法。

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

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


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

于 2012-09-12T10:31:00.820 回答
2

阅读本文档

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

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

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

希望 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]
}

compare() 方法在 Java 中的工作原理

于 2019-05-30T00:40:10.283 回答