2016-11-23 4 views
1

이 질문은 목록 정렬에 관한 것입니다. 특정 순서로 목록 목록 정렬

나는 차량

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

차량이 될 수 얻을 수있는 일반적인 방법이 자동차 등

Car extends Vehicle 
Bus extends Vehicle 

내가 5 회 getRandomVehiclesList를 (호출 할 말 오토바이, 버스, 트럭, SUV,) 그런 다음 결과 목록에서 특정 순서로 5 개의 목록을 정렬합니다.

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

목록이 순서

에 있어야
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 '을 런타임에 실행하면 두 목록에 모두 포함됩니다. 이 작업을 수행 할 수있는 유일한 방법은 목록에서 요소를 선택하여 가능한 유형을 판별하고 그 기준으로 정렬하는 것입니다. 물론리스트가 비어 있거나리스트''을 가지고 있다면 까다로운 일입니다. 왜냐하면'Car'와'Truck'을 모두 포함 할 수 있기 때문입니다. –

+0

당신은 어떻게 *** getRandomVehiclesList ***를 호출하는 guaaranty 수 있습니다 자동차 또는 트럭 만 반환합니다 ??, 그들은 모두 동일한 인터페이스 차량입니다 차량 –

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