Java 在比较器的比较函数中未比较整数对象 类MyComparator实现比较器 { @凌驾 公共整数比较(整数o1,整数o2){ 如果(o1>o2)//第3行 返回1; 否则如果(o1==o2) 返回0; 其他的 返回-1; } }
在第3行,既没有取消装箱,也无法调用intValue()。请帮助理解这一点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行出现编译错误。一旦解决了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 ();
}
}