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)
即使我已经覆盖了默认方法,如果我使用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.
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |