Jak wykonać sortowanie przygotowanej tablicy?

0

Witam,
Mam stworzone klasę Employment z zaimplementowanym interfejsem comparable do posortowania.
Jak mam w wywołać sortowanie takiej tablicy?
Jeżeli stworzę

 List tab = new Arraylist<...>() 

i daje Collections.sort(tab)

  to działa a dla <code class="c"> Arrarlist tab = new Arraylist<...>(); 

nie działa, tzn bład przy kompilacji.

Zrobiłem tak:

        tab.sort(new Comparator<Object>() {
            @Override
            public int compare(Object o1, Object o2) {
                Employment ex1 = (Employment)o1;
                Employment ex2 = (Employment)o2;
                return ex1.compareTo(ex2);
            }
        });

a da jakoś jeszcze jakoś inaczej?

0
  1. Jaki błąd?
  2. Czemu usuwasz parametryzację? Daj Dupa<Jasia> dupaJasia = new Dupa<>();
0

taki błąd:

Error:(26, 20) java: no suitable method found for sort(java.util.ArrayList<java.lang.Object>)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
      (inferred type does not conform to upper bound(s)
        inferred: java.lang.Object
        upper bound(s): java.lang.Comparable<? super java.lang.Object>)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
      (cannot infer type-variable(s) T
        (actual and formal argument lists differ in length)) 
0

ArrayList mam typu Object jak dam zamiast object nazwe klase to działa. Tylko typ musi być Object...

0

Object nie implementuje Comparable<Object> więc jedyną opcją która może się skompilować jest podanie ekstra komparatora, który operuje na Object i to właśnie zrobiłeś.

Dlaczego typ musi być Object? Chyba coś mocno skopałeś. I tak w komparatorze rzutujesz na Employment, więc jak wrzucisz do listy coś co nie jest Employment to dostaniesz ClassCastException. Czemu nie zrobisz listy od Employment?

0

Dobra więc tak.
Mam stworzoną klasę Pracownik i Szef, gdzie klasa Szef dziedziczy po klasie Pracownik i ma dodatkowo jeszcze kilka pół.
Chcę przechowywać wszystko najlepiej w tablicy (arraylist) żeby można było wszystkie dane razem w pętli wypisać (dodatkowe pola klasy szefa), i tutaj pytanie jakiego typu powinna być tablica?

  1. Dać typ object i potem w pętli sprawdzać nazwę klasy i rzutować na odpowiedni typ
  2. Dać typ Pracownik i potem rzutować obiekt nadklasy na podklasę (w tę stronę chyba się nie powinno?)
1

W obu przypadkach rzutujesz obiekt nadklasy na podklasę, bo Object to nadklasa wszystkich obiektów (na co sama nazwa wskazuje).

Jeśli masz klasę bazową Pracownik i podklasę typu Szef (abstrahując od słuszności takiego dziedziczenia) to najrozsądniej zaimplementować w klasie Pracownik interfejs Comparable<Pracownik>, a co za tym idzie metodę compareTo. Metoda powinna operować tylko na polach dostępnych w klasie Pracownik. Następnie lista Pracowników to może być po prostu List<Pracownik> a nie List<Object> i może być sortowana bez podawania ekstra komparatora.

Jeśli chcesz coś wypisywać to zrób metodę wypisz() (albo raczej print()) w klasie Pracownik i nadpisz ją w klasie Szef. Jako że wszystkie metody w Javie są wirtualne (to powinieneś wiedzieć) to po wywołaniu metody wypisz() wykona się metoda z klasy obiektu, niezależnie na co byłby w danej chwili zrzutowany.

0

No dobra a jeżeli zaimplementuje interfejs w klasie bazowej to podklasa też go odziedziczy ?

1

Jeśli zaimplementujesz Comparable<Pracownik> w klasie Pracownik, to klasa Szef, która dziedziczy po Pracownik też będzie miała zaimplementowane Comparable<Pracownik>. Stąd, jeśli wrzucisz wszystko do kolekcji typu List<Pracownik> to będziesz mógł odpalić na nich Collections.sort() bez ekstra komparatora.

Motywem przewodnim takiego działania systemu typów jest to, że jeśli metoda jest w stanie porównać dwóch Pracowników (a to robi metoda compareTo w interfejsie Comparable<Pracownik>), to w szczególności jest w stanie porównać dwóch Szefów, albo Pracownika i Szefa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1