【问题标题】:Java : How to use the `Comparator` interface [closed]Java:如何使用`Comparator`接口[关闭]
【发布时间】:2015-06-02 07:10:36
【问题描述】:
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;
        }

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

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

【问题讨论】:

  • 你至少尝试过编译这个吗?
  • 私人课程!!!你确定吗?
  • 由于您的比较器属于 类型,因此您的 obj1obj2 对象应显式声明为Event 对象,而不是 Object 对象
  • @NeerajJain 内部课程?你知道它们是什么吗?
  • 对不起,大错特错 - “比较器属于 类型”,可以假设为空检查。

标签: java object comparator compareto


【解决方案1】:

首先,Comparator 需要compare 方法,而不是compareTo。而且由于你的类实现了Comparator&lt;Event&gt;,所以方法的参数应该是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() 永远不会返回 null。如果它可以返回null,则需要更多的null检查。

【讨论】:

  • 我认为 private modifier 是不允许的。
  • @NeerajJain 那是一个内部类。你确定你明白 Eran 的回答吗?
  • @ChetanKinger 为什么你认为它是一个内部类?
  • @NeerajJain 为什么你认为不是?当你在一个类前面看到private 时,你应该假设它是一个内部类。您不应该仅仅因为您不希望该类成为内部类而拒绝一个好的答案。
  • @TheLostMind ,明白了,它起来了 :)
【解决方案2】:

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


如果您使用Comparator,请注意以下几点

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

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

【讨论】:

    【解决方案3】:

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

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

    使用 Comparator 你需要重写 compare 方法而不是 compareTo。

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

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

    【讨论】:

      【解决方案4】:

      Comparator 接口没有 compareTo 方法。它有 compare 方法。 第二件事,由于您是 Comparator ,因此使用 Event 类型类/接口进行了泛型化,请将方法签名更改为如下。

      public int compare(Event obj1, Event obj2) {

      }

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        相关资源
        最近更新 更多