Java 在比较器的比较函数中未比较整数对象 类MyComparator实现比较器 { @凌驾 公共整数比较(整数o1,整数o2){ 如果(o1>o2)//第3行 返回1; 否则如果(o1==o2) 返回0; 其他的 返回-1; } }

Java 在比较器的比较函数中未比较整数对象 类MyComparator实现比较器 { @凌驾 公共整数比较(整数o1,整数o2){ 如果(o1>o2)//第3行 返回1; 否则如果(o1==o2) 返回0; 其他的 返回-1; } },java,Java,在第3行,既没有取消装箱,也无法调用intValue()。请帮助理解这一点 第3行出现编译错误。一旦解决了lexicore提到的问题,这是代码中的第二个问题 class MyComparator<Integer> implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { if(o1>o2) // line no 3

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


第3行出现编译错误。

一旦解决了lexicore提到的问题,这是代码中的第二个问题

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;
    }
}
这是通过引用进行比较,因为两个操作数都是引用类型

=
仅当至少一个操作数为数值类型(即除
布尔值
之外的基元)时,才是数值相等运算符

显式取消装箱:

if(o1==o2)

或者选中没有引用值对应项的
o1
,这样将取消装箱包装的数字操作数。

您应该在
MyComparator
中删除
。这里发生的事情是将一个
整数
声明为类型变量。它不是
java.lang.Integer
,它只是编译器不知道的某个类型变量。

如lexicore所述,您不需要对方法进行类型注释

if(o1.intValue()==o2.intValue())
类MyComparator实现比较器
如果不想在该范围内重新定义整数。相反,请使用:

class MyComparator <Integer> implements Comparator<Integer>
类MyComparator实现比较器
{
@凌驾
公共整数比较(整数o1,整数o2){
返回o2-o1;
}
}
引用已知的整数

class MyComparator implements Comparator<Integer>
{
      @Override
      public int compare (Integer o1, Integer o2) {
        return o2 - o1;
      }
}
import java.util.*;
类MyComparator实现比较器
{
@凌驾
公共整数比较(整数o1,整数o2){
返回o2-o1;
}
}
公共类CmpInt
{
/** */
公共静态void main(字符串参数[])
{
inta[]={1,3,7,9,4,2,5};
List li=新的ArrayList();
对于(int i:a)
li.添加(i);
Comparator ci=新的MyComparator();
Collections.sort(li,ci);
对于(整数ii:li)
System.out.printf(“%d”,ii);
System.out.println();
}
}

为什么你认为这些是
java.lang.Integer
对象?错误是什么?如果你有整数对象,为什么不使用
Integer\compare
呢?我可以使用它,但我很好奇这为什么不起作用。你认为
MyComparator
做什么?不,与
=
没有任何关系。好的。但这将是OP的下一个问题,当外部类型变量被删除时。是的,你是对的。好的,同意你的观点,但当我们在MyComparator中删除整数时,编译器如何解决它不是类型变量的问题?我是泛型新手,所以如果遗漏了什么,也不介意basic@RishabShinghal:将您的类声明为
类MyComparator实现了Comparator
谢谢Alexander,我理解了lexicore的观点并尝试了它,它工作得非常好。我试图理解为什么删除整数会起作用。不要使用减法来比较整数,因为减法可能会溢出。使用
o1.compareTo(o2)
Integer.compare(x,y)
在原语
int
的情况下,避免整数溢出。@Pshemo或只是不要尝试用
MyComparator
重新发明轮子,使用
Comparator.naturalOrder()
。该代码演示了如何声明比较器以及它编译成功和运行,而不是如何实现比较。已经有足够的整数比较符AFAIK。
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 ();
    }
}