按特定顺序对列表列表进行排序

时间:2016-11-23 21:45:45

标签: java sorting collections rx-java guava

这个问题是关于排序列表。

我有一种获取车辆的通用方法

0 <= Private <= 500
501 <= PrivateI <= 1000
...

车辆可以是汽车,摩托车,公共汽车,卡车,SUV等。

List<Vehicle>  getRandomVehiclesList() {    
   return  fetchVehicles(); 
   //returns List <Car>, List<Bus>, etc
   };

假设我想调用5次getRandomVehiclesList(),然后按特定顺序对生成的5个列表进行排序。

---------------------------------

列表需要遵守此订单

Car extends Vehicle
Bus extends Vehicle

---------------------------------

但结果可以按此顺序或其他随机顺序返回。

List<Car>
List<Truck>
List<SUV>
List<Bus>
List<Motorcycle>

排序所有列表的最佳方法是什么,以便它们符合上面显示的顺序(汽车,卡车,Suv,公共汽车,摩托车)

可以使用RxJava来简化吗?

1 个答案:

答案 0 :(得分:1)

您可以轻松创建自己的Comparator<List<Vehicle>>利用Guava的Ordering.explicit比较器:

class VehicleListComparator implements Comparator<List<Vehicle>> {
    private final Ordering<Class<? extends Vehicle>> vehicleClassOrdering;

    public VehicleListComparator(Ordering<Class<? extends Vehicle>> vehicleClassOrdering) {
        this.vehicleClassOrdering = vehicleClassOrdering;
    }

    @Override
    public int compare(List<Vehicle> vehiclesList1, List<Vehicle> vehiclesList2) {
        Class<? extends Vehicle> left = getVehicleClass(vehiclesList1);
        Class<? extends Vehicle> right = getVehicleClass(vehiclesList2);
        return vehicleClassOrdering.compare(left, right);
    }

    private Class<? extends Vehicle> getVehicleClass(List<Vehicle> vehicleList) {
        if (vehicleList.isEmpty()) {
            throw new IllegalArgumentException();
        } else {
            return vehicleList.get(0).getClass();
        }
    }
}

然后,您可以使用此比较器对车辆清单进行排序:

Ordering<Class<? extends Vehicle>> vehicleClassOrdering = Ordering.explicit(Arrays.asList(
        Car.class, Truck.class, SUV.class, Bus.class, Motorcycle.class));
Collections.sort(vehicleLists, new VehicleListComparator(vehicleClassOrdering));