基于特定元素对数组进行排序

时间:2016-04-14 17:57:11

标签: java arrays sorting

所以我有一个对象列表,特别是车辆列表,其中包含汽车,摩托车和汽车。这些物体中的每一个都具有不同的属性(例如,汽车和摩托车具有最大速度,而不是双曲线。)

Moto Bicicle和Car是Vehicle和Vehicle的子类,实现了Comparable接口。

他们确实有共同点,制作它们的那一年,这就是我想要使用该特定属性对数组进行排序的方式。默认情况下,java基于对象具有的另一个属性进行排序,即“颜色”。

这是用于对数组进行排序的代码。(必须是这个)

public static <T> void sortArray(Comparable<T>[] a) {
        Arrays.sort(a);
}

有没有办法选择我想用来对列表进行排序的属性? 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

默认情况下Arrays.sort根据其元素的Comparable natural ordering进行排序。如果要更改它,请改用Arrays.sort(T[] a, Comparator<? super T> c),它允许定义自己的比较器。

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(T[],java.util.Comparator)

答案 1 :(得分:1)

您可以实现自己的比较器并将其传递给Arrays.sort(array, comparator)。使用lambdas或方法句柄很容易:

Vehicle[] v = ...
Arrays.sort(v, (v1,v2) -> v1.getYear() - v2.getYear());

Arrays.sort(v, Comparator.comparing(Vehicle::getYear));

基于此,您可以编写一个通用函数,该函数按特定属性对数组进行排序:

public static <T, U extends Comparable<? super U>> void sortArray(T[] a, 
    Function<? super T, ? extends U> attribute) {
    Arrays.sort(a, Comparator.comparing(attribute));
}   

并将其与

一起使用
sortArray(v, Vehicle::getYear);