2016-11-23 125 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)); 
相關問題