【问题标题】:Collections.sort won't work with custom comparator?Collections.sort 不适用于自定义比较器?
【发布时间】:2011-06-29 14:12:58
【问题描述】:
import java.util.*;

public class ABC {
    public static void main(String[] args) {
        List<Integer> values = null;

        values = new ArrayList<Integer>();
        values.add(5);
        values.add(9);
        values.add(3);
        values.add(55);
        values.add(4);

        Collections.sort(values);
        System.out.println(values);



        values = new ArrayList<Integer>();
        values.add(5);
        values.add(9);
        values.add(3);
        values.add(55);
        values.add(4);

        Comparator<Integer> cmp = new Comparator<Integer>() {
                    @Override
                    public int compare(Integer o1, Integer o2) {
                        int o1i = o1;
                        int o2i = o2;
                        return o1i - o1i;
                    }
                };

        Collections.sort(values, cmp);
        System.out.println(values);
    }
}

打印出来:

[3, 4, 5, 9, 55]
[5, 9, 3, 55, 4]

这显然不是预期的结果。我错过了什么?

【问题讨论】:

  • 你的 compare 方法总是返回 0。

标签: java sorting collections comparator


【解决方案1】:

你有一个错误:

改变

return o1i - o1i;

到

return o1i - o2i;

【讨论】:

  • 谢谢。并认为我在提交之前已经阅读了 3 遍 :)
  • 这是那些伟大的“聪明的编程技巧”之一,只有在你知道自己在做什么的情况下才应该使用它——对于没有无符号类型的语言根本不应该使用(对于你仍然可以转换的整数)长到可以工作)。除了 Integer.MAX_VALUE
【解决方案2】:

你的比较器减去o1i - o1i,每次都给你0。

(将o1 和o2 分配给本地int 变量也不会获得任何收益;只需减去o1 - o2。)

【讨论】:

  • 这样做主要是为了在有问题的行放置一个断点。
【解决方案3】:

你有一个输入错误,comperator应该有return o1i - o2i;

而不是return o1i - o1i;

【讨论】:

    【解决方案4】:
    return o1i - o1i;
    

    我猜你的意思是;

    return o1i - o2i;
    

    【讨论】:

      【解决方案5】:

      用这个

      int o1i = o1;
                          int o2i = o2;
                          return o1i - o2i;
      

      这给出了以下结果

      [3, 4, 5, 9, 55]
      

      [3, 4, 5, 9, 55]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        相关资源
        最近更新 更多