【问题标题】:Integer Objects not getting compared in compare function of Comparator [duplicate]在 Comparator 的比较功能中未比较整数对象 [重复]
【发布时间】:2018-02-18 20:31:56
【问题描述】:
class MyComparator<Integer> implements Comparator<Integer>
{

    @Override
    public int compare(Integer o1, Integer o2) {
        if(o1>o2) // line no 3
         return 1;
         else if(o1==o2)
             return 0;
         else
             return -1;
    }
}

在第 3 行,既没有拆箱,我也无法调用 intValue()。请帮助理解这一点。

在第 3 行,编译错误来了。

【问题讨论】:

  • 你为什么认为那些是java.lang.Integer对象?
  • 错误是什么?
  • 如果你有整数对象,为什么不使用Integer#compareTo
  • 我可以使用它,但我很想知道为什么它不起作用。
  • 你认为MyComparator&lt;Integer&gt; 会做什么?

标签: java


【解决方案1】:

您应该删除MyComparator&lt;Integer&gt; 中的&lt;Integer&gt;。这里发生的情况是您将Integer 声明为类型变量。它不是java.lang.Integer,它只是一些编译器一无所知的类型变量。

【讨论】:

  • 好的同意你的观点,但是当我们在 MyComparator 中删除 Integer 时,编译器如何能够解析它不是类型变量?我是泛型新手,所以如果错过任何基本知识,请不要介意
  • @RishabShinghal:将您的班级声明为class MyComparator implements Comparator&lt;Integer&gt;
  • 谢谢亚历山大,我理解了 lexicore 的观点并尝试了它,它工作得很好。我试图理解为什么如果我们删除 Integer 会起作用。
【解决方案2】:

此代码中的次要问题,一旦您解决了 lexicore 提到的问题。

if(o1==o2)

这是通过引用进行比较,因为两个操作数都是引用类型。

== 仅在至少有一个操作数是数字类型(即除boolean 之外的原语)时才是数字相等运算符。

显式拆箱:

if(o1.intValue()==o2.intValue())

或者检查o1 &lt; o2,它没有引用值对应物,因此将拆箱包装的数字操作数。

【讨论】:

  • 不,与==无关。
  • 好的。但这将是 OP 的下一个问题,即移除无关的类型变量。
  • 是的,你是对的。
【解决方案3】:

正如 lexicore 所提到的,您不会对方法进行类型注释

class MyComparator <Integer> implements Comparator<Integer>

如果您不想在该范围内重新定义 Integer。相反,使用:

class MyComparator implements Comparator<Integer>
{
      @Override
      public int compare (Integer o1, Integer o2) {
        return o2 - o1;
      }
}

引用众所周知的整数。

import java.util.*;

class MyComparator implements Comparator<Integer>
{
      @Override
      public int compare (Integer o1, Integer o2) {
        return o2 - o1;
      }
}

public class CmpInt
{
    /** */
    public static void main (String args[])
    {
        int a[] = {1, 3, 7, 9, 4, 2, 5};
        List <Integer> li = new ArrayList<> ();
        for (int i: a)
            li.add (i);
        Comparator <Integer> ci = new MyComparator ();
        Collections.sort (li, ci);
        for (Integer ii: li)
            System.out.printf ("%d ", ii);
      System.out.println ();
    }
}

【讨论】:

  • 不要使用减法来比较整数,因为减法可能会溢出。
  • 在原始int 的情况下使用o1.compareTo(o2)Integer.compare(x,y) 以避免整数溢出。
  • @Pshemo 或者只是不要尝试用MyComparator 重新发明轮子,而使用Comparator.naturalOrder()
  • 该代码演示了如何声明一个比较器,它编译成功并运行,而不是如何实现比较。已经有足够的整数比较器,AFAIK。
猜你喜欢
  • 2012-09-14
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多