两个单独方法中的 CompareTo 方法

use*_*123 1 java collections compare

我有一个实现 Comparable 接口的类。我想按对象的 ID 和名称对对象进行排序,但使用两种单独的方法。例如按id排序:

 public int compareTo(Metro m1) {
       return this.id - m1.id;
    }
Run Code Online (Sandbox Code Playgroud)

我还想按名称排序,这意味着我必须这样做:

public int compareTo(Metro m1) {
       return this.name.compareTo(m1.name);
}
Run Code Online (Sandbox Code Playgroud)

问题是我无法编写具有相同名称和相同参数的相同函数,我该如何解决这个问题?当我调用Collections.sort(this.list);对象列表时,它如何确定我想按 ID 或名称对列表进行排序?

rzw*_*oot 5

Comparable如果类型具有所谓的“自然顺序”,则实现是合适的。这将是一个对“没有任何进一步的上下文,你认为这些对象将如何排序”的完美答案的命令?

例如,如果我要求您在没有进一步上下文的情况下订购“1、9 和 7”,您肯定会说:嗯,呃,我猜是 1,7,9?如果后来我告诉你:实际上我想让你用英语拼出这些数字,然后按其长度排序,所以,1,9,7 - 好吧,但这很出乎意料。

就您而言,“按名称”和“按 ID”听起来同样合理。

这意味着Metro类型根本没有自然顺序,因此不应实现 Comparable

那么,你如何对它们进行排序呢?幸运的是,sort()有一个重载:您可以提供一个 Comparator 对象。这就是解决这个问题的方法:

// requires getId() to exist as a method:
Comparator<Metro> byUnid = comparingInt(Metro::getId);
this.list.sort(byUnid);

// Works because strings do have natural order
Comparator<Metro> byName = comparing(Metro::getName)
Run Code Online (Sandbox Code Playgroud)

就是这么简单。请注意,您的compareTo by id 方法已损坏 - 对于非常大的数字,它会失败。您应该努力在比较器界面中使用comparing、和 链接解决方案。comparingInt