【问题标题】:How do I make 2 comparable methods in only one class?如何仅在一个类中制作 2 个可比较的方法?
【发布时间】:2025-12-26 03:55:11
【问题描述】:

我有一个类,我已经按一个属性对其进行了排序。 现在我需要做另一件事,我需要创建另一种方式来对我的数据进行排序。 我怎样才能做到,所以我可以在两种方法之间进行选择。 我知道的唯一命令是 Collections.sort,它将从我想要比较其数据的类中选择方法 compareTo。

有可能吗?

【问题讨论】:

  • 如果可以使用更明确的词来代替“事物”和“方式”,那么给出好的答案会更容易。就目前而言,我必须恭敬地承认我很难理解确切的问题。

标签: java sorting collections comparable


【解决方案1】:

您需要做的是实现自定义Comparator。然后使用:

Collections.sort(yourList, new CustomComparator<YourClass>());

具体来说,您可以编写:(这将创建一个实现Comparator 的匿名类。)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

如果您愿意,您可以将这些构建到您的课程中:

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

可以这样使用:

Collections.sort(yourList, YourClass.getAttribute2Comparator());

【讨论】:

    【解决方案2】:

    您的班级中只能有一个compareTo() 方法。

    如果您想以不止一种方式对同一类进行排序,请创建 Comparator 实现。

    【讨论】:

      【解决方案3】:

      如果这两种方法需要完全相同的占用空间,则您可能不恰当地重载了具有多种用途的单个类,这可以通过修复您的类层次结构来解决 - 比如不使用“shape”,而是使用“oval”对其进行子类化, “矩形”等

      如果子类化没有意义,您需要创建不同的比较类。在 Java 中,您经常使用 Comparator 进行比较。创建多个(或创建可配置的比较器):IsbnComparator、AuthorComparator 等。

      哦,可配置的选项是:

      BookComparator 实现 Compartor { 枚举字段{作者,ISBN,...}; setSortOrder(int rank, FIELD field){...} }

      【讨论】: