compareTo和compare如何工作?

时间:2012-09-12 10:24:00

标签: java

我知道比较和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)从comparecompareTo

返回

4 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:4)

一般案例排序算法基于比较。如果您在ab之间进行比较,则恰好有3种可能性:a == ba > ba < b

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

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

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

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


(1)嗯,自己想想,但它已经存在,实际上:)

答案 2 :(得分:2)

阅读this document

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

  • compare(a, b)
    比较器接口。比较两个对象的值。这是作为Comparator接口的一部分实现的,通常的用途是定义一个或多个实现它的小实用程序类,传递给sort()等方法,或者通过排序TreeMap和TreeSet等数据结构来使用。您可能希望为以下内容创建Comparator对象:

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

答案 3 :(得分: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]
}

How compare() method works in Java