当我执行下面的代码时,我的输出为[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));
}
}
如何对数字进行排序?
答案 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
类型点击了一些内容。正确比较两个float
或double
值要困难得多。如果您不处理-0.0
,可能会0.0
和-0.0
错误处理。如果你不处理NaN
,它可能会导致灾难(排序后的随机顺序,损坏TreeMap
等)。幸运的是,每个盒装类型都有一个名为compare
的静态方法:Integer.compare
(自Java 7起),Double.compare
,Float.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));
}