我有一个关于比较器接口的问题。在我的类下面实现了按长度而不是按字符值排序的默认排序的接口。
覆盖默认比较后,我使用Arrays.sort()
对我的字符串数组进行排序。即使我覆盖了默认方法,如果我使用Arrays.sort,它会调用默认比较而不是我覆盖的方法。这是因为我显式调用了超类方法吗?
另一个问题是初始化接口本身。我知道您不能初始化接口,而是初始化一个类对象(实现所述接口)来引用接口可用的方法。在这种情况下,当我初始化比较器时,<代码>数组。排序(strArr,new Ideone()) 排序工作正常。该方法如何知道我正在传递一个比较器?我只初始化了一个类对象,没有显式调用compare(ob1,ob2)方法。
即使我使用比较器x=新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));
}
}
Arrays.sort(strArr)
这使用java比较器对字符串对象数组进行排序。您还没有告诉您的排序函数使用您创建的比较函数。需要对您的Ideone类进行引用。
Comparator x = new Ideone();
因为Ideone()实现了Comparator,所以它必须实现Comparator接口中的所有方法。变量x将使用Ideone类的比较方法,因为它被重写了。然而,如果您试图使用Ideone类中不在Comparator类中的方法,那么您将抛出一个异常。
我认为这里的问题是,虽然您已经创建了一个用于<代码>数组的比较器。排序,实际上您还没有告诉数组。排序以使用它。默认情况下,如果你只是说
Arrays.sort(strArr);
然后使用默认的比较器对字符串进行排序。要告诉排序算法使用自定义比较器,需要将其作为第二个参数传递给该方法:
Arrays.sort(strArr, new Ideone());
试试看这是否能解决问题。作为一个有趣的测试,在比较函数中放入println语句,看看是否可以看到它被调用。
也就是说,以这种方式实现比较器是非常罕见的。更常见的方法是这样做:
Arrays.sort(strArr, new Comparator<String>() {
public int compare(Object s1, Object s2) {
return (s1.toString().length() - s2.toString().length());
}
});
现在,您不需要在Ideone类上实现比较,这更清楚地表明:(1)它不会自动调用,(2)您只需要在这一个排序步骤中使用它。
即使我已经重写了默认方法,如果我使用数组。排序时,它调用默认的比较,而不是我的重写方法。这是因为我显式调用了超类方法吗?
不,这是因为在您给出的示例中,您没有传入比较器-因此排序
方法无法知道您正在尝试使用自定义比较。
在这种情况下,当我初始化一个比较器时,Arrays.sort(strArr, new Ideone());
排序工作正常。该方法如何知道我正在向其传递一个比较器?
因为您正在调用接受比较器的重载。只有一个过载和两个参数:
public static <T> void sort(T[] a, Comparator<? super T> c)
现在不可否认,如果您实现了比较器,那么它会更好
我只初始化了一个类对象,没有显式调用compare(ob1,ob2)方法。
事实上,您不必调用compare。这就是排序方法的工作。您传入比较器,以便它可以调用compare。
我是java新手,试图理解一些概念。这是一段我不懂的代码。 我知道这是怎么回事,但不明白为什么这是允许的。因此,我的问题是: 从java文档中,比较器[T]是一个接口。比较器[水果]怎么样?我将假设它是一个类,因为它必须覆盖比较函数。 为什么可以在{}中使用非参数构造函数和类定义来初始化FruitName比较器?我在比较器[T]的javadoc中没有找到这样的构造函数声明。 如有任何意见,将不胜感
当我在浏览上面的接口时,在阅读了许多相同主题的站点后,我对这些接口的语法不是很清楚。 请考虑以下代码段: 如果每个查询都是可理解的。
问题内容: 假设我有一对班 我希望先按第一个值排序,然后再按第二个值排序。现在,如果我这样做 一切正常,列表按对的第一个值排序,但是如果我这样做 它因错误而失败 好的,所以它可能无法推断参数,所以如果我这样做 它因错误而失败 为什么它对compare()而不是compare()。thenComparing()有效? 问题答案: 该错误似乎与的通用参数有关。一种解决方法是尝试使用显式类型: 请注意,
本文向大家介绍对比Java中的Comparable排序接口和Comparator比较器接口,包括了对比Java中的Comparable排序接口和Comparator比较器接口的使用技巧和注意事项,需要的朋友参考一下 Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在
我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和