比较器内部的返回值实际上是什么意思?
例如:
class TreeSetDemo
{
public static void main(String arg[])
{
TreeSet t=new TreeSet(new MyComparator());
t.add(new Integer(20));
t.add(new Integer(10));
t.add(new Integer(30));
t.add(new Integer(100));
System.out.println(t);
}
class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
return 0;
}
}
}
如果返回类型为1,则实际返回
[20,10,30,100]
如果返回类型为-1,则实际返回
[100,30,10,20]
如果返回类型为0,则实际返回
[20]
请告诉我这表明了什么?
答案 0 :(得分:61)
返回value
(不是type
,类型为int
)告诉调用者(排序数据的事物):
-1 : o1 < o2
0 : o1 == o2
+1 : o1 > o2
如果您总是为比较器返回相同的值(o,1,-1),无论它的输入如何,那么您都没有正确使用它。您需要根据传入的值返回返回值。这个想法是数据结构(或分类器)在需要订购两个元素时调用比较函数,以找出将它们放入的顺序。
值得注意的是,正/负整数值(-1,+ 1)不需要为1,它们可以是任何正/负数。通常的做法是返回-1 / + 1。
答案 1 :(得分:1)
您会混淆返回类型和返回值。返回类型为int
。返回值在documentation:
返回负整数,零或a 正整数作为第一个参数 小于,等于或大于 比第二个。
答案 2 :(得分:1)
Comparator documentation - 返回: 第一个参数的负整数,零或正整数小于,等于或大于第二个参数。
答案 3 :(得分:1)
您使用的TreeSet
不具有相同的值(Set的属性)。因此,当比较值并且返回值零时,Java将它们视为相等并仅保留第一个值。因此,您只能看到一个值。
答案 4 :(得分:0)
这是关于需要比较的排序算法。
正确:
class MyComparator implements Comparator<Integer> {
public int compare(Integer o1, Integer o2) {
return o1.complare(o2);
}
}
答案 5 :(得分:0)
根据您希望基于此比较器进行排序的方式,您需要在比较器中放置一些逻辑。您的比较器仅返回0,表示相等
class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
}
答案 6 :(得分:0)
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
if(o1.intValue() > o2.intValue()){
return -1;
}else if(o1.intValue() < o2.intValue()){
return 1;
}
return 0;
}
});
pq.add(44);
pq.add(3);
pq.add(2);pq.add(5);
System.out.println(pq.poll());
//outpu 44
它会在按降序添加元素时对元素进行排序。它将根据返回值比较两个对象,它将保持顺序。