Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比较器接口与比较器初始化_Java_Arrays_String_Sorting_Inheritance - Fatal编程技术网

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

Java比较器接口与比较器初始化,java,arrays,string,sorting,inheritance,Java,Arrays,String,Sorting,Inheritance,我有一个关于比较器接口的问题。下面我的类实现了按长度排序字符串的接口,而不是按默认排序(按字符值排序) 覆盖默认比较后,我使用Arrays.sort()对字符串数组进行排序。即使我已经重写了默认方法,如果我使用Arrays.sort,它也会调用默认的比较方法,而不是重写的方法。这是因为我显式调用了超类方法吗 另一个问题是初始化接口本身。我知道您不能初始化接口,而是初始化类对象(实现所述接口)以引用接口可用的方法。在本例中,当我初始化一个比较器时,Arrays.sort(strArr,new-Id

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

覆盖默认比较后,我使用
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));
    }
}

我认为这里的问题是,虽然您创建了一个用于
数组.sort
的比较器,但实际上您并没有告诉
数组.sort
使用它。默认情况下,如果你只是说

 Arrays.sort(strArr);
那么。要告诉排序算法使用自定义比较器

试试看这是否能解决问题。作为一个有趣的测试,在比较函数中放入一个
println
语句,看看是否可以看到它被调用

也就是说,以这种方式实现比较器是非常不寻常的。更常见的方法是这样做:

 Arrays.sort(strArr, new Comparator<String>() {
     public int compare(Object s1, Object s2) {
       return (s1.toString().length() - s2.toString().length());
     }
 });
Arrays.sort(strArr,新的比较器(){
公共整数比较(对象s1、对象s2){
返回(s1.toString().length()-s2.toString().length());
}
});
现在,您不需要在
Ideone
类上实现
compare
,这更清楚地表明:(1)它不会被自动调用,(2)您只需要在这一个排序步骤中使用它

即使我已经重写了默认方法,如果我使用Arrays.sort,它也会调用默认的比较方法,而不是重写的方法。这是因为我显式调用了超类方法吗

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

在本例中,当我初始化一个比较器时,
Arrays.sort(strArr,new-Ideone())排序工作正常。该方法如何知道我正在传递一个比较器

因为您正在调用接受比较器的重载。只有两个参数:

public static <T> void sort(T[] a, Comparator<? super T> c)
publicstaticvoidsort(T[]a,Comparator
这将使用java comparator对字符串对象数组进行排序。您还没有告诉排序函数使用您创建的比较函数。需要有对Ideone类的引用

Comparator x = new Ideone();

因为Ideone()实现Comparator,它必须实现Comparator接口中的所有方法。变量x将使用Ideone类的compare方法,因为它被重写。但是,如果您尝试使用Ideone类中不在Comparator类中的方法,则会引发异常。

您没有告诉sort使用您的Comparator。这也是设置比较器的一种奇怪方式。请参阅示例。您可能还需要检查
strArr
是否至少有3个元素。我建议将比较器实现与主类分开。比较器只是比较器,并且其中没有无关的静态方法时,更容易理解。@dsh是的,我想我将来会这样做!那很有帮助!我没有意识到我只是重写了2参数,并期望默认的排序调用会自动调用它。很抱歉,我没有意识到在重写比较之后,我必须传入一个比较器,以便它使用我的自定义比较方法。我假设至少,一旦我在类中重写它,它将被默认调用。我必须仔细阅读这个主题。@Help123:对,不。如果不将实例传递给
sort
方法,它就无法计算出上下文是什么。很高兴它有帮助。这肯定有帮助。我假设您正在使用一个匿名类来创建一个用于pa的比较器将它放入排序方法。@Help123是的,就是这样。一般来说,如果你需要一个一次性比较器,这是一个很好的方法来制作一个!
Arrays.sort(strArr)
Comparator x = new Ideone();