2016-11-23 3 views
1

Этот вопрос касается сортировки списков.Сортировка списка списков в определенном порядке

У меня есть универсальный метод, чтобы получить Транспорт

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

Транспортных средств могут быть автомобили, мотоциклы, автобусы, грузовики, внедорожники и т.д.

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 'во время выполнения - они оба просто' List'. Единственный способ сделать это - выбрать элемент из списка, чтобы определить вероятный тип, и сортировать по этой причине. Конечно, это сложно, если ваш список пуст, или если у вас есть «Список », так как это может содержать как «Автомобиль», так и «Грузовик». –

+0

Как вы можете гарантировать, что вызов метода *** getRandomVehiclesList *** вернет только автомобили или грузовики ??, они все те же самые интерфейсы Автомобиль –

+0

Гарантируется возврат только автомобилей или грузовиков. Я думал, возможно, добавив их в список списков, таких как Multimap, и сортировать с новым компаратором, который скажет вам заказ на основе индекса. Как вы думаете? –

ответ

1

Вы можете легко создать свой собственный Comparator<List<Vehicle>> воспользовавшись Ordering.explicit компаратора гуавы в:

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