我有以下示例:
public class Utils{
public static int compareByLength(String s1, String s2)
{
return s1.length() - s2.length();
}
}
Arrays.sort(srt,Utils::compareByLength);
我理解Java8中的参考方法,我理解这里的排序条件。
我不明白的是引擎盖排序如何运作。它接受静态方法:' compareByLength'并且知道如何将字符串s1,s2翻译成比较器变量。
我理解Array.sort将第二个参数作为:Comparator<? super T> c
但我仍然很难理解功能如何compareByLength
以及实际&#34;理解&#34;比较标准。
谢谢, 射线。
答案 0 :(得分:2)
Arrays.sort
方法代码如下所示
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null)
c = NaturalOrder.INSTANCE;
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
所以基于参数,它使用排序算法,例如在这种情况下合并排序或tim排序传递给你想要排序的数组和比较器,它应该用来决定元素应该如何排序(如果比较器不会被传递默认一个NaturalOrder.INSTANCE
将被使用。)
由于Comparator
是功能接口,因为它只有一个抽象方法
int compare(T o1, T o2);
我们可以使用与使用lambda相同的方法引用Utils::compareByLength
(String s1, String s2) -> Utils.compareByLength(s1,s2)
所以它几乎与传递匿名内部类的实例相同,后者扩展Comparator<String>
接口并使用lambda体实现其compare
方法。所以你的代码类似于
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Utils.compareByLength(s1, s2);
}
});
现在一般合同是Comparator#compare(value1, value2)
返回
此标准用于排序算法的实现,因此无论是否使用 merge 排序,快速排序或 tim sort 合同都保持不变相同。现在每个排序算法都可以使用在sort
方法中传递的比较器,在你的情况下是比较器,这要归功于Lambdas或更精确的方法参考,使用Utils.compareByLength
方法来判断它是否有两个元素被切换或不。
答案 1 :(得分:0)
它只是返回两个长度之间的差异。你最终会得到一个负数或一个正数(在这种情况下,两个变量中的一个或另一个应该在排序顺序中排在第一位)或者长度是相同的,这意味着你将得到一个零。而已。如果你交换减法中涉及的两个数字,你会看到你切换排序顺序(即从升序到降序)。此比较适用于java排序方法排序中涉及的所有数字。
您可以在该方法中比较字符串或缓冲区的大小,或者您拥有的内容,具体取决于您要排序的内容(即字符串,类等)。你可以把逻辑放在那里先做减法,然后是0,那么平局破坏者可以检查一些其他变量。但是你总是要返回一个正数,负数或零的数字,它告诉算法进行排序,比较两个参数中的哪一个是“赢家”。