我知道比较和compareTo
会返回int
值。
例如:
Returns
0 if a equal b
-1 if a < b
+1 if a > b
sort
方法调用compareTo
或compare()
方法。但sort
方法如何在比较时排列list
或compareTo
返回int
值。在compare
或compareTo
返回int值进行排序后运行的背景场景是什么?sort
方法如何使用int值(-1
或0
或1
)从compare
和compareTo
答案 0 :(得分:19)
如果要比较的两个元素(a,b)已经是正确的顺序,compare(a, b)
和a.compareTo(b)
都会返回<= 0
的值,因此不必发生任何事情。
如果它们的顺序不正确,则返回值为> 0
,表示它们必须互换。
答案 1 :(得分:4)
一般案例排序算法基于比较。如果您在a
和b
之间进行比较,则恰好有3种可能性:a == b
,a > b
,a < b
。
compare()
或compareTo()
方法提供了这些信息。
现在,为了使用这些信息,我们设计了许多sorting algorithms,从天真bubble sort开始,有些是更先进的,例如quick sort。每个都为排序问题提供了一些不同的方法。
Java为其排序实现选择了TimSort算法。
作为练习,您可以设计自己的 1 排序算法。你能用compare()
方法找到数组的最大元素吗?当你发现它应该在哪里?你下一步该怎么做?
(1)嗯,自己想想,但它已经存在,实际上:)
答案 2 :(得分:2)
a.compareTo(b)
:
可比的界面。比较值并返回一个int,它告诉值是否比较小于,等于或大于。
如果您的类对象具有自然顺序,请实现Comparable接口并定义此方法。所有具有自然排序的Java类都实现了这一点(String,Double,BigInteger,...)。
compare(a, b)
:
比较器接口。比较两个对象的值。这是作为Comparator接口的一部分实现的,通常的用途是定义一个或多个实现它的小实用程序类,传递给sort()等方法,或者通过排序TreeMap和TreeSet等数据结构来使用。您可能希望为以下内容创建Comparator对象:
答案 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]
}