2016-11-23 123 views
1

此问题与排序列表有关。按特定顺序对列表进行排序

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

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> 

什么是所有的列表进行排序的最好方式,使他们符合上面的顺序(汽车,卡车,越野车,公交车,摩托车)

能RxJava可以用于简化?

+3

之间存在'没有什么区别列表'和'列表'在运行时 - 它们都只是'List's。您可以做到这一点的唯一方法是从列表中选择一个元素来确定可能的类型,并在此基础上进行排序。当然,如果你的清单是空的,或者你有一个'List ',那可能会很棘手,因为它可能包含一个'Car'和一个'Truck'。 –

+0

如何保证调用方法*** getRandomVehiclesList ***将只返回汽车或卡车??,它们都是相同的接口车辆 –

+0

它保证只返回汽车或卡车。我想也许把它们加入像Multimap这样的列表列表中,然后用一个新的比较器进行排序,这个比较器会根据索引告诉你该命令。你怎么看? –

回答

1

您可以轻松创建番石榴的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)); 
相关问题