当前位置: 首页 > 知识库问答 >
问题:

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

黄信厚
2023-03-14

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

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

共有3个答案

陆洲
2023-03-14
Arrays.sort(strArr)

这使用java比较器对字符串对象数组进行排序。您还没有告诉您的排序函数使用您创建的比较函数。需要对您的Ideone类进行引用。

Comparator x = new Ideone();

因为Ideone()实现了Comparator,所以它必须实现Comparator接口中的所有方法。变量x将使用Ideone类的比较方法,因为它被重写了。然而,如果您试图使用Ideone类中不在Comparator类中的方法,那么您将抛出一个异常。

田权
2023-03-14

我认为这里的问题是,虽然您已经创建了一个用于<代码>数组的比较器。排序,实际上您还没有告诉数组。排序以使用它。默认情况下,如果你只是说

 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)您只需要在这一个排序步骤中使用它。

聂炜
2023-03-14

即使我已经重写了默认方法,如果我使用数组。排序时,它调用默认的比较,而不是我的重写方法。这是因为我显式调用了超类方法吗?

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

在这种情况下,当我初始化一个比较器时,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和