2016-11-23 8 views
1

この質問はリストを並べ替えることについてです。特定の順序でリストのリストを並べ替える

私は車

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

車を取得するための一般的な方法は車することができ、オートバイ、バス、トラック、SUVなど

Car extends Vehicle 
Bus extends Vehicle 

は、私は5回getRandomVehiclesListを(呼び出すしたいとしてい)、結果のリストを特定の順序でソートします。

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

LISTの順にする必要があります

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

が、その結果を返すことができますこの順序または他のランダムな順序。彼らは上に示した順序(車、トラック、SUV、バス、オートバイ)

を簡素化するために使用することができますRxJavaに一致するよう

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

すべてのリストをソートするための最良の方法は何ですか?

+3

'の間に違いはありませんList 'と' List 'は実行時には両方とも' List'sです。これを実行できる唯一の方法は、リストからエレメントを選択して、可能なタイプを判別し、その基準でソートすることです。もちろん、あなたのリストが空であるか、 'List 'を持っていれば、それは 'Car'と' Truck'の両方を含むことができるので、難しいです。 –

+0

どうやってgetRandomVehiclesList ***メソッドを呼び出すことができますか?***車やトラックのみ返されます??、彼らはすべて同じインターフェイスです車 –

+0

車やトラックのみを返すことが保証されています。多分Multipapのようなリストのリストにそれらを追加し、インデックスに基づいて順序を教える新しいコンパレータでソートすることを考えていました。どう思いますか? –

答えて

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)); 
関連する問題