2016-11-23 8 views
1

Bei dieser Frage geht es um das Sortieren von Listen.Sortieren einer Liste von Listen in einer bestimmten Reihenfolge

Ich habe eine generische Methode Fahrzeuge

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

Fahrzeuge können zu bekommen sein Auto, Motorrad, Bus, LKW, SUV, usw.

Car extends Vehicle 
Bus extends Vehicle 

sagen, dass ich 5 mal getRandomVehiclesList nennen wollen () und sortieren Sie dann die resultierenden 5 Listen in einer bestimmten Reihenfolge.

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

Diese Liste muss in dieser Reihenfolge WERDEN

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

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

aber die Ergebnisse können in zurückgegeben werden diese Reihenfolge oder andere zufällige Reihenfolge.

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

Was ist der beste Weg, um alle Listen zu sortieren, so dass sie oben dargestellt, um die Reihenfolge übereinstimmen (Auto, LKW, Geländewagen, Bus, Motorrad)

Kann RxJava verwendet werden, zu vereinfachen?

+3

Es gibt keinen Unterschied zwischen ' Liste 'und' List 'zur Laufzeit - sie sind beide nur' List's. Die einzige Möglichkeit besteht darin, ein Element aus der Liste auszuwählen, um den wahrscheinlichen Typ zu bestimmen und auf dieser Grundlage zu sortieren. Natürlich ist das schwierig, wenn Ihre Liste leer ist, oder wenn Sie eine "Liste " haben, da diese sowohl ein "Auto" als auch einen "Truck" enthalten könnte. –

+0

Wie können Sie garantieren, dass das Aufrufen der Methode *** getRandomVehiclesList *** nur Autos oder Trucks zurückgibt? Sie sind alle die gleiche Schnittstelle Fahrzeug –

+0

Es ist garantiert, nur Autos oder Lastwagen zurückgeben. Ich überlegte, ob ich sie vielleicht in eine Liste von Listen wie eine Multimap einfügen und mit einem neuen Vergleicher sortieren könnte, der Ihnen die Reihenfolge auf der Basis eines Indexes verrät. Was denken Sie? –

Antwort

1

Sie können ganz einfach Ihr eigenes Comparator<List<Vehicle>> Ausnutzen von Ordering.explicit Komparators Guava erstellen:

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

können Sie dann sortieren Sie Ihre Liste der Fahrzeuglisten mit diesem Komparator mit:

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