jkl*_*mnn 3 java arrays sorting
我想按这些对象的指定属性对对象列表进行排序,我想选择应该用于排序的属性.例:
class Car{
private String name;
private String colour;
public enum sortBy {NAME, COLOUR};
public String name(){
return name;
}
public String colour(){
return colour;
}
public static Car[] getSortedArray(Car[] carArray, sortBy sortType){
HashMap<Object, Car> carMap = new HashMap<Object, Car>();
Object[] sortArray = new Object[carArray.length];
Object value = null;
for(int i = 0; i < carArray.length; i++){
if(sortType == sortBy.NAME){
value = carArray[i].name();
}else if(sortType == sortBy.COLOUR){
value = carArray[i].colour();
}
carMap.put(value, carArray[i]);
sortArray[i] = value;
}
Arrays.sort(sortArray);
Car[] sortedArray = new Car[sortArray.length];
for(int i = 0; i < sortArray.length; i++){
sortedArray[i] = carMap.get(sortArray[i]);
}
return sortedArray;
}
}
//external:
Car[] cars = getSomeCars();
Car[] nameSortedCars = Car.getSortedArray(cars, Car.sortBy.NAME);
Car[] colourSortedCars = Car.getSortedArray(cars, Car.sortBy.COLOUR);
Run Code Online (Sandbox Code Playgroud)
这个想法很简单:
我将所有想要排序的值放入一个数组中,然后创建一个将这些值映射回其对象的地图.在我对这个数组进行排序之后,我将映射到这些值的对象放在一个新的数组中,然后按这些值排序.这些值只是使用Object类型创建的,因此我可以按多种类型排序(不仅仅是示例中的字符串).
除非你有两个具有相同属性值的对象,否则只有一个对象将在返回的数组中,但是两次,这样可以正常工作.
有没有更好的方法来实现这种排序?
使用自定义比较器会更简单:
排序方式name:
Arrays.sort(carArray, Comparator.comparing(Car::name));
Run Code Online (Sandbox Code Playgroud)
排序方式colour:
Arrays.sort(carArray, Comparator.comparing(Car::colour));
Run Code Online (Sandbox Code Playgroud)
所以你可以修改getSortedArray():
public static Car[] getSortedArray(Car[] carArray, Comparator<Car> comparator) {
Car[] sorted = carArray.clone()
Arrays.sort(sorted, comparator);
return sorted;
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
Car[] sorted = getSortedArray(carArray, Comparator.comparing(Car::name));
Run Code Online (Sandbox Code Playgroud)
编辑:
如果使用不支持这些功能的语言版本,则可以通过显式创建实现Comparator接口的嵌套类来创建比较器.
例如,这是一个通过以下方式Comparator比较Car实例的单例name:
static enum ByName implements Comparator<Car> {
INSTANCE;
@Override
public int compare(Car c1, Car c2) {
return c1.name().compareTo(c2.name());
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话:
Car[] sorted = getSortedArray(carArray, ByName.INSTANCE);
Run Code Online (Sandbox Code Playgroud)