problem z prawidłowym posortowaniem kolejki

0

Cześć,
mam problem z prawidłowym posortowaniem kolejki. Chce posortować kolejkę priorytetową, najpierw samochody ciężarowe i sortowanie po przebiegu, następnie samochody osobowe i również posortowane po przebiegu. Zaś mój kod sortuję wszystkie elementy tylko po przebiegu. Ma ktoś jakiś pomysł?

Queue<Samochod> carsForRepairQueue = new PriorityQueue<>(new Comparator<Samochod>() {
            @Override
            public int compare(Samochod o1, Samochod o2) {
                if (o1 instanceof SamochodCiezarowy) {
                    if (o1.getKilometrage() > o2.getKilometrage()) {
                        return -1;
                    } else if (o1.getKilometrage() < o2.getKilometrage()) {
                        return 1;
                    } else {
                        return 0;
                    }
                } else if (o2 instanceof SamochodOsobowy) {
                    if (o1.getKilometrage() > o2.getKilometrage()) {
                        return -1;
                    } else if (o1.getKilometrage() < o2.getKilometrage()) {
                        return 1;
                    } else {
                        return 0;
                    }
                }else {
                    return 0;
                }
            }
        });

W konsoli otrzymuje:
O_sO5_Nissan, przebieg = 380000
O_sO3_Scoda, przebieg = 315000
C_Scania, przebieg = 300000
O_sO1_Fiat, przebieg = 300000
C_Mercedes-Benz, przebieg = 250000

powinienem mieć najpierw
C_Scania, przebiegiem = 300000
C_Mercedes-Benz = 250000
O_sO5_Nissan, przebieg = 380000
O_sO3_Scoda, przebieg = 315000
O_sO1_Fiat, przebieg = 300000

z góry dzięki za pomoc

2

Ale sieka :D.
Najpierw porównaj po typach obu obiektów. Jeżeli o1 jest ciężarówka, a o2 osobówką to zwróć -1, w przeciwnym wypadku zwróć 1. Jeżeli typy są takie same to porównaj po kilometrach.

PS.
Coś w tym stylu?

Comparator.comparing((Samochod o) -> o instanceof SamochodCiezarowy ? -1 : 1)
          .thenComparing(Samochod::getKilometrage)
0

Hej,
już prawie działa tak jak oczekiwałem, lecz kilometry są wyświetlane rosnąco. Jak zrobić aby były malejąco?

0

Hej, znalazłem sposób.

Comparator.comparing((Samochod o)
                -> o instanceof SamochodOsobowy ? -1 : 1).thenComparing(Samochod::getKilometrage).reversed());

dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.