按特定顺序对列表列表进行排序
Sorting a list of lists in an specific order
这道题是关于排序列表的。
我有一个获取车辆的通用方法
List<Vehicle> getRandomVehiclesList() {
return fetchVehicles();
//returns List <Car>, List<Bus>, etc
};
交通工具可以是汽车、摩托车、公共汽车、卡车、SUV 等。
Car extends Vehicle
Bus extends Vehicle
假设我想调用 5 次 getRandomVehiclesList(),然后按特定顺序对生成的 5 个列表进行排序。
————————————————————————————————
列表需要按此顺序排列
List<Car>
List<Truck>
List<SUV>
List<Bus>
List<Motorcycle>
————————————————————————————————
但可以按此顺序或其他随机顺序返回结果。
List<Bus>
List<Motorcycle>
List<Truck>
List<Car>
List<SUV>
对所有列表进行排序以使其符合上面显示的顺序(汽车、卡车、SUV、公共汽车、摩托车)的最佳方法是什么
可以用RxJava来简化吗?
您可以利用 Guava 的 Ordering.explicit
比较器轻松创建自己的 Comparator<List<Vehicle>>
:
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));
这道题是关于排序列表的。
我有一个获取车辆的通用方法
List<Vehicle> getRandomVehiclesList() {
return fetchVehicles();
//returns List <Car>, List<Bus>, etc
};
交通工具可以是汽车、摩托车、公共汽车、卡车、SUV 等。
Car extends Vehicle
Bus extends Vehicle
假设我想调用 5 次 getRandomVehiclesList(),然后按特定顺序对生成的 5 个列表进行排序。
————————————————————————————————
列表需要按此顺序排列
List<Car>
List<Truck>
List<SUV>
List<Bus>
List<Motorcycle>
————————————————————————————————
但可以按此顺序或其他随机顺序返回结果。
List<Bus>
List<Motorcycle>
List<Truck>
List<Car>
List<SUV>
对所有列表进行排序以使其符合上面显示的顺序(汽车、卡车、SUV、公共汽车、摩托车)的最佳方法是什么
可以用RxJava来简化吗?
您可以利用 Guava 的 Ordering.explicit
比较器轻松创建自己的 Comparator<List<Vehicle>>
:
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));