Я хочу отсортировать список объектов по указанному атрибуту этих объектов, и я хочу выбрать, какой атрибут должен использоваться для сортировки. Пример:java сортировать список объектов по атрибуту
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);
Идея проста:
я ставлю все значения, которые я хочу, чтобы сортировать в массив, и я создать карту, которая отображает эти значения обратно к их объектам. После того, как я отсортировал этот массив, я беру объекты, сопоставленные этим значениям, и помещаю их в один и тот же порядок в новый массив, который затем сортируется по этим значениям. Значения только что создаются с помощью типа Object, поэтому я могу сортировать по нескольким типам (а не только по строкам, как в примере).
Это прекрасно работает, если у вас нет двух объектов с одинаковым значением атрибута, тогда только один объект будет в возвращенном массиве, но два раза.
Есть ли лучший способ добиться этой сортировки?
проблема заключается в том, что HashMap не принимает дублированные ключи, а если у вас есть 2 объекта с одним и тем же ключом, второй будет перегружать первый. – lcjury