Java比较器接口和初始化比较器

Hel*_*123 0 java arrays sorting string inheritance

我有一个关于比较器接口的问题.我的类下面实现了按长度排序字符串的接口,而不是按字符值排序的默认排序.

覆盖默认比较后,我习惯Arrays.sort()对字符串数组进行排序.即使我已经覆盖了默认方法,如果我使用Arrays.sort,它会调用默认的比较而不是我的重写方法.这是因为我明确地调用了超类方法吗?

另一个问题是初始化接口本身.我知道你不能初始化一个接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法.在这种情况下,当我初始化比较器时,Arrays.sort(strArr, new Ideone());排序正常工作.该方法如何知道我将它传递给比较器?我只初始化了一个类对象,并没有compare(ob1, ob2)明确地调用该方法.

即使我这样做Comparator x = new Ideone();,类对象如何简化为比较器对象?对此的任何解释都会有所帮助.

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone implements Comparator
{

    static String ThirdGreatest(String[] strArr)
    { 
        Arrays.sort(strArr);
        //Arrays.sort(strArr, new Ideone());
        for(String x: strArr)
            {
            System.out.println(x);
            }
        return strArr[strArr.length-3];
    } 

    @Override
    public int compare(Object s1, Object s2)
    {
        return (s1.toString().length() - s2.toString().length());
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        String[] myarr = {"coder","byte","code", "asfasfasfasf"};
        System.out.println(ThirdGreatest(myarr));
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

即使我已经覆盖了默认方法,如果我使用Arrays.sort,它会调用默认的比较而不是我的重写方法.这是因为我明确地调用了超类方法吗?

不,这是因为在您给出的示例中,您没有传递比较器 - 因此该sort方法无法知道您正在尝试使用自定义比较.

在这种情况下,当我初始化比较器时,Arrays.sort(strArr, new Ideone());排序正常工作.该方法如何知道我将它传递给比较器?

因为你正在调用接受比较器的重载.这里唯一一个过载有两个参数:

public static <T> void sort(T[] a, Comparator<? super T> c)
Run Code Online (Sandbox Code Playgroud)

现在可以肯定的是,如果你实现Comparator<String>而不是原始Comparator类型会更好,但它仍然有效.

我只初始化了一个类对象,并没有compare(ob1, ob2)明确地调用该方法.

确实 - 不必打电话compare.这是该sort方法的工作.你传递比较器,以便它可以调用compare.