java按可指定属性排序对象列表

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类型创建的,因此我可以按多种类型排序(不仅仅是示例中的字符串).

除非你有两个具有相同属性值的对象,否则只有一个对象将在返回的数组中,但是两次,这样可以正常工作.
有没有更好的方法来实现这种排序?

And*_*ira 6

使用自定义比较器会更简单:

排序方式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)