父亲使用Java 8解释有关Short和Static的方法

时间:2014-06-15 16:00:20

标签: java sorting java-8

我有以下示例:

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;比较标准。

谢谢, 射线。

2 个答案:

答案 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)返回

  • 0 等值,
  • 否定 值,如果第一个元素小于第二个元素,这意味着按升序排列它们在正确的位置
  • 如果第一个元素大于第二个元素,则
  • 值,这意味着它们未被排序(使用升序)。

此标准用于排序算法的实现,因此无论是否使用 merge 排序,快速排序 tim sort 合同都保持不变相同。现在每个排序算法都可以使用在sort方法中传递的比较器,在你的情况下是比较器,这要归功于Lambdas或更精确的方法参考,使用Utils.compareByLength方法来判断它是否有两个元素被切换或不。

答案 1 :(得分:0)

它只是返回两个长度之间的差异。你最终会得到一个负数或一个正数(在这种情况下,两个变量中的一个或另一个应该在排序顺序中排在第一位)或者长度是相同的,这意味着你将得到一个零。而已。如果你交换减法中涉及的两个数字,你会看到你切换排序顺序(即从升序到降序)。此比较适用于java排序方法排序中涉及的所有数字。

您可以在该方法中比较字符串或缓冲区的大小,或者您拥有的内容,具体取决于您要排序的内容(即字符串,类等)。你可以把逻辑放在那里先做减法,然后是0,那么平局破坏者可以检查一些其他变量。但是你总是要返回一个正数,负数或零的数字,它告诉算法进行排序,比较两个参数中的哪一个是“赢家”。