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

如何为任何类型的可比较对象实现compareTo

宇文兴言
2023-03-14

我不知道如果没有其他变量告诉我哪个更大,我怎么能比较两个可比较的对象。问题是:创建一个名为Max的类,该类提供一个名为Max的类方法。Max将两个参数用于可以比较的对象,即实现如上所示的Java Compariable接口的对象。它返回对较大值的引用。如果两个对象相等,则应返回第一个对象。实现的可比性取决于每个类,您的方法将在多个不同类型的对象上调用。

它在接口中提供了int compareTo(Object other)方法,但我很难找到解决方案。

public class Max implements Comparable 
{
    public int compareTo(Object other)
    {

    }

    public static Comparable max(Comparable first, Comparable second)
    {
        int fi = first.compareTo(second);
        if(fi >0)
            return first;
        else if (fi<0)
            return second;
        return first; 
    }
}

java.lang.AssertionError:类不应该实现可比:预期[false]但发现[true]

这是错误之一。但我也需要帮助编写compareTo方法。

共有2个答案

洪高扬
2023-03-14

你的问题的关键词是泛型。你可能想做一些研究,读一些关于它的东西。请看下面的示例。为了保持简单,我将Max类实现为一个静态类:

import java.time.LocalDate;

public class MyTestClass{ 
    public static void main(String args[]) {
        Integer i = 16;
        Integer j = 15;
        Integer m = Max.max(i, j);
        System.out.println(m);
        String k = "aaaa";
        String n = "zzzz";
        String s = Max.max(k, n);
        System.out.println(s);
        LocalDate d = LocalDate.now();
        LocalDate e = LocalDate.now().plusDays(2);
        LocalDate f = Max.max(d , e);
        System.out.println(f);
    }
    static class Max{
        public static <T extends Comparable> T max(T first, T second) {            
            if (first.compareTo(second) >= 0)
                return first;
            else
                return second;
        }
    }
}

如您所见,有一个类Max,它有一个方法Max,它接受两个对象,例如两个整数、两个字符串或两个日期对象

由于所有这些类都实现了可比较的接口,因此可以对所有对象类型使用max方法。然后,编译器在运行时决定调用哪个comapreTo方法,即类Integer、String、LocalDate等的compareTo。

程昕
2023-03-14

我删除了我之前的答案,因为我觉得,嗯,你把事情复杂化了。因为max的两个参数实现了可比较的

java prettyprint-override">int ret = first.compareTo(second);

然后根据ret的值返回first或second,就像您正在做的那样。这样,您就不需要知道它是如何实现的。也许你可以从你的导师或其他正在做这项工作的人那里得到一些澄清(我想这是为了一项作业)。

您可以创建一些实现接口的测试类。您只需构造一些表示大小的变量即可。

 类似资料:
  • 问题内容: 我有几种要比较的“任何”值类型。 使用==运算符会显示错误: “二进制运算符’==’不能应用于两个’Any’(aka’protocol <>’)操作数” 这样做的方式是什么? 问题答案: 唯一的方法是使用带有类型参数的函数,然后比较值是否都是该类型的值: 现在,使用上面的变量,您可以像这样比较它们:

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示:

  • 问题内容: 基本上我想这样做: 我试过了: 而且没有用。 另外,其他类型呢?例如,我无法复制。 问题答案: 就您而言,将返回。 您可能还需要阅读以下内容:http : //www.canonical.org/~kragen/isinstance/

  • 我想比较两个物体。然而,当我运行它时,它告诉我它们不匹配,尽管它们匹配。请让我知道我做错了什么,谢谢。下面是我的代码:

  • 问题内容: 我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们的确不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,并且在必须对CollectionUtils执行操作之后。我在Google上搜索了一下,发现了Comparator的解决方案,但只有相同的类型。 我试图朝这个方向实施思考,但是我不知道我是否在正

  • 我需要写一个比较器,取一个a类型的对象a和一个B类型的对象B。这两个对象不是一个公共对象的扩展。他们确实是不同的,但我需要比较这两个对象在它的共同领域。我必须使用比较器接口,因为对象存储在Set中,之后我必须使用CollectionUtils进行操作。我搜索了一点点,我用比较器找到了解决方案,但只有相同的类型。 TXS 附注:我在不同的集合中添加两个对象: 之后我会这样想: