【问题标题】:Sorting a list of lists in an specific order按特定顺序对列表列表进行排序
【发布时间】:2017-04-08 01:32:33
【问题描述】:

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

我有一个通用的方法来获取 Vehicles

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 可以用来简化吗?

【问题讨论】:

  • List&lt;Car&gt; 和 List&lt;Truck&gt; 在运行时没有区别 - 它们都只是 Lists。您可以这样做的唯一方法是从列表中选择一个元素以确定可能的类型,并在此基础上进行排序。当然,如果你的列表是空的,或者你有一个List&lt;Vehicle&gt;,这会很棘手,因为它可能同时包含一个Car 和一个Truck。
  • 你如何保证调用方法 getRandomVehiclesList 将只返回 Cars 或 Trucks??,它们都是同一个接口 Vehicle
  • 保证只退回汽车或卡车。我在想也许将它们添加到像 Multimap 这样的列表列表中,并使用新的比较器进行排序,该比较器会根据索引告诉您顺序。你怎么看?
  • 安迪·特纳在现场。如果您需要处理潜在的空列表,则需要返回列表以外的内容。例如,包含列表和列表中车辆类型的对象。枚举将是表示车辆类型的不错选择。

标签: java sorting collections rx-java guava


【解决方案1】:

您可以利用 Guava 的 Ordering.explicit 比较器轻松创建自己的 Comparator&lt;List&lt;Vehicle&gt;&gt;:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多