Java : 如何使用 `Comparator` 接口

Java : How to use the `Comparator` interface

private class myComparator implements Comparator<Object>{

        @Override
        public int compareTo(Object obj1, Object obj1) {


            if ((obj1.getNumber() - obj2.getNumber()) == 0) {
                return 0;
            }
            if ((obj1.getNumber() > obj2.getNumber())  { 
                return 1;
            }

            return -1;
        }

嘿,我不知道如何在我正在实现的比较器 class 中实现这个 compareTo 方法。我正在尝试将两个对象的整数值按升序进行比较。但是我真的不知道我要去哪里

稍后,我将在另一个 class 中将此 class 称为 collections.sort(someList, myComparator)。

对象没有 getNumber 方法。由于您已经在使用泛型,因此比较方法签名应该是:

public int compare(Event obj1, Event obj1) {
                  ^^

对于 Comparator,您需要覆盖比较方法而不是 compareTo。

现在您可以对事件对象使用 getNumber。另外你不应该使用 number1 - number2 因为它可能会导致数字溢出,因此我建议你使用类似的东西:

num1<num2 ? -1 : (num1==num2 ? 0 : 1)

首先,Comparator需要一个compare方法,而不是compareTo。并且由于您的 class 实现了 Comparator<Event>,该方法的参数应该是 Events.

private class myComparator implements Comparator<Event>
{
    @Override
    public int compare(Event obj1, Event obj1) {
        if (obj1 == null) {
            if (obj2 == null) {
                return 0;
            } else {
                return 1;
            }
        } else if (obj2 == null) {
            return -1;
        }
        return obj1.getNumber().compareTo(obj2.getNumber());
    }
}

请注意,我假设 getNumber() 永远不会 return 为空。如果可以 return null,则需要进行更多的 null 检查。

编辑后,您的 Comparator 现在采用 Object 类型。下面解释的相同规则将适用于您的 Comparator<Object>。但是,如果没有显式转换,您将无法调用 getNumber 方法,因为对象没有任何此类方法。


使用Comparator

需要注意以下几点
  1. 您实现了 Comparator<Event> 接口。这意味着您要比较两个 Event 个对象。
  2. A Comparator 没有 compareTo 方法。它有一个 compare 方法,该方法将采用您正在实施的 Comparator 类型的两个参数。由于您实现了 Comparator<Event>,因此您的 compare 方法应该采用 2 Event 个参数。
  3. 阅读 Comparatorcompare 方法的 java-doc。它解释了 int return 值代表什么。如果 getNumber return 是一个数字,请避免减法,否则您可能会成为溢出的受害者。
  4. 您已声明 myComparatorprivate class。仅当 myComparator 是内部 class 时才允许这样做。

我故意不提供更正后的代码,因为我想避免用勺子喂你答案。

比较器接口没有 compareTo 方法。它有 compare 方法。 第二件事,因为你是 Comparator is generified with Event type class/interface,改变方法签名如下。

public int compare(Event obj1, Event obj2) {

}

一般规则,如果两个对象相等,则 return 0,如果第一个对象大于第二个[在比较逻辑中],则 return 1 否则 return -1。