使用Comparator和Arrays.asList()进行排序

时间:2015-07-17 09:10:05

标签: java arrays collections comparator

当我执行下面的代码时,我的输出为[0, -2000000000, 2000000000]

import java.util.Arrays;
import java.util.Comparator;

public class SordidSort {
public static void main(String args[]) {
    Integer big = new Integer(2000000000);
    Integer small = new Integer(-2000000000);
    Integer zero = new Integer(0);
    Integer[] arr = new Integer[] { big, small, zero };
    Arrays.sort(arr, new Comparator<Object>() {
        public int compare(Object o1, Object o2) {
            return ((Integer) o2).intValue() - ((Integer) o1).intValue();
        }
    });
    System.out.println(Arrays.asList(arr));
    }
}

如何对数字进行排序?

4 个答案:

答案 0 :(得分:1)

而不是

public int compare(Object o1, Object o2) {
    return ((Integer) o2).intValue() - ((Integer) o1).intValue();
}

使用以下

public int compare(Object o1, Object o2) {
    int x1 = ((Integer) o1).intValue();
    int x2 = ((Integer) o2).intValue();
    if (x1 < x2) {
        return -1;
    } else if (x1 == x2) {
        return 0;
    } else {
        return 1;
    }
}

您的代码可能会产生溢出。当产生溢出时,您可以获得奇怪的订单。

答案 1 :(得分:0)

手动实施比较器有一些细微之处。您刚刚针对int类型点击了一些内容。正确比较两个floatdouble值要困难得多。如果您不处理-0.0,可能会0.0-0.0错误处理。如果你不处理NaN,它可能会导致灾难(排序后的随机顺序,损坏TreeMap等)。幸运的是,每个盒装类型都有一个名为compare的静态方法:Integer.compare(自Java 7起),Double.compareFloat.compare等等。使用它们,你永远不会遇到这样的问题。

由于Java 8实现比较器要简单得多:您已准备好辅助方法,如Comparator.comparingInt

Arrays.sort(arr, Comparator.comparingInt(o -> ((Integer)o).intValue()));

答案 2 :(得分:0)

将代码更改为以下::

import java.util.Arrays;
import java.util.Comparator;

public class SordidSort {

    public static void main(String args[]) {
        Integer big = new Integer(2000000000);
        Integer small = new Integer(-2000000000);
        Integer zero = new Integer(0);
        Integer[] arr = new Integer[] { big, small, zero };
        Arrays.sort(arr, new Comparator<Object>() {
            public int compare(Object o1, Object o2) {

                int o1Val = ((Integer) o1).intValue();
                int o2Val = ((Integer) o2).intValue();

                if(o1Val > o2Val){
                    return 1;
                } else if(o1Val == o2Val){
                    return 0;
                }else{
                    return -1; 
                }
            }
        });
        System.out.println(Arrays.asList(arr));

    }
}

答案 3 :(得分:0)

您可以将比较器声明为new Comparator<Integer>(),以便将Integer传递给比较功能,然后您可以从Integer.compareTo方法中受益

public static void main(String args[]) {
    Integer big = new Integer(2000000000);
    Integer small = new Integer(-2000000000);
    Integer zero = new Integer(0);
    Integer[] arr = new Integer[] { big, small, zero };
    Arrays.sort(arr, new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
      }
    });
    System.out.println(Arrays.asList(arr));
  }