【问题标题】:Return type from a Comparator比较器的返回类型
【发布时间】:2021-07-23 13:02:33
【问题描述】:

Comparator 内部的返回值究竟是什么意思?

例如:

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表示==1表示>-1表示<
  • “1”、“-1”和“0”不是类型,而是值。
  • 比较器的作用在其文档中有很好的阐述。在简单提问之前尝试阅读一下。

标签: java


【解决方案1】:

返回value(不是type,类型是int)告诉调用者(排序数据的东西):

-1 : o1 < o2
0 : o1 == o2
+1 : o1 > o2

如果您总是为比较器返回相同的值(o、1、-1),而不管它的输入是什么,那么您就没有正确使用它。您需要根据传入的值返回值。这个想法是数据结构(或排序器)在需要对两个元素进行排序时调用比较函数,以找出将它们放入的顺序。

值得注意的是,正/负整数值(-1,+1)不必为1,它们可以是任何正/负数。返回 -1/+1 只是常见的做法。

【讨论】:

  • 如何实现升序或降序?值得想象的是,如果比较器返回的值大于 0,则检查的两个元素的位置会被交换。另一种想法是,排序函数总是按升序排序。通过在 o1>o2 时返回 -1,您可以说对不交换元素的排序函数。这样就实现了降序排序。
【解决方案2】:

您混淆了 return-typereturn-value。返回类型为int。返回值在documentation中描述:

返回一个负整数、零或一个 正整数作为第一个参数 小于、等于或大于 比第二个。

【讨论】:

    【解决方案3】:

    这里使用比较器的方式是错误的,但为了澄清您的疑问,为什么在返回值为 0 时只写入 [20] id...

    您使用的 TreeSet 不包含相同的值(Set 属性)。因此,当比较值并且返回值是时,Java 将它们视为相等并仅保留第一个值。因此,您只会看到一个回报。

    【讨论】:

      【解决方案4】:

      Comparator documentation -- 返回: 负整数、零或正整数作为第一个参数小于、等于或大于第二个参数。

      【讨论】:

        【解决方案5】:

        根据您希望如何基于此比较器进行排序,您需要在比较器中放置一些逻辑。你的比较器只返回 0 表示相等

        class MyComparator implements Comparator {
        
            public int compare(Object o1, Object o2) {
                // TODO Auto-generated method stub
                return o1.compareTo(o2);
            }
        }
        

        【讨论】:

        • 我认为这不会编译,因为Object 没有可比性。
        • o1 (Object) 类没有compareTo 方法,但您可以将其转换为return ((String)o1).compareTo((String)o2);
        【解决方案6】:

        这是关于需要比较的排序算法。

        正确:

        class MyComparator implements Comparator<Integer> {
            public int compare(Integer o1, Integer o2) {
                // Calling the Integer class's compareTo method
                return o1.compareTo(o2);
            }
        }
        

        【讨论】:

          【解决方案7】:
          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
          
          

          它会在添加元素时按降序对元素进行排序。它会根据返回值比较两个对象,并保持顺序。

          【讨论】:

            猜你喜欢
            • 2021-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多