Jak posortować listę Comparatorem albo Comprable z różnymi polami.

0

Mam klasę bazową: KlasaBaza (z polami nazwa, data), z niej dziedziczą dwie inne klasy, Klasa1 oraz Klasa2. Klasy dziedziczące mają prócz pól "nazwa" i "data" pole "strumien" dla Klasa1 i "kodowanie" dla Klasa2.
Stworzyłem ArrayList<KlasaBaza>, w której przechowuje obiekty tych trzech klas.
Problem pojawił się, gdy chciałem posortować obiekty. Bez problemu sortuję po "nazwa" i "data", ale gdy chcę jeszcze, by obiekty były posortowane po "kodowanie" dla Klasy2 i po "strumien" dla Klasa1 nic nie wychodzi.

0

I nie powinno! Bo z poziomu klasy bazowej ich nie widać. Wyobraź sobie że masz w tej liście obiekty obu typów. Jak by to mialo niby zadziałać jakbyś chciał sortować po którymś z tych pól?

0

Ok, ale jak tego w takim razie dokonać ??

0

Ale co chcesz dokonać konkretnie?

0

napisz własny komparator który dostarczysz z listą obiektów do Collections.sort() np.

Collections.sort(list, new Comparator<klasabaza>() {
            @Override
            public int compare(klasabaza o1, klasabaza o2) {
                // .... porownywanie obiektow
                return jakisWynikPorownania;
            }
        }); 
0

Do Shalon:
po prostu chcę by PlikTekstowy i PlikBinarny sortował się jeszcze po 'kodowanie' i 'skrot'. (To one dziedziczą po plik)
http://scr.hu/16s7/spoec

Do Zarek:
zrobiłam coś takiego, ale .... to nie działa ;p
http://scr.hu/16s7/c09vv

1

@Xender tu Ci powiedziano, czemu tak nie zrobisz w układzie, który masz:

Shalom napisał(a):

I nie powinno! Bo z poziomu klasy bazowej ich nie widać.

Jaśniej się nie da. :)

0

To chcecie mi powiedzieć, że NIC nie mogę z tym zrobić, nic a nic? Musi to zostać nieposortowane?

Dopytuję, by mieć pewność, że nie ma żadnego innego sposobu?

0

Jest. W klasie bazowej trzymaj wszystkie pola... ;-)

0

Nie mogę, bo to psuje ideę dziedziczenia. Plik ma nie mieć tych pól ...

1
Xender napisał(a):

Nie mogę, bo to psuje ideę dziedziczenia. Plik ma nie mieć tych pól ...

Użyj operatora instanceof w komparatorze, który sprawdzi czy oba porównywane obiekty są reprezentantami tej samej klasy dziedziczącej. Jeśli tak, to zrób rzutowanie i je porównaj. To bardzo brzydkie rozwiązanie i należy unikać takich rzeczy, bo taki kod jest trudniej modyfikowalny - musisz pamiętać o zmianach w komparatorze, psuje przejrzystość kodu i ogólnie bardzo niepolecane rozwiązanie, ale skoro się uparłeś...

Dziedziczenie nie jest jakąś regułą, której należy się trzymać, ba - w wielu przypadkach, takich jak ten, należy go unikać i używać np. kompozycji - klasy "dzieci" powinny zawierać w sobie obiekt klasy "rodzica" jako jedno z pól, a nie rozszerzać tylko dlatego, że jest to możliwe.

Tu masz jak tego użyć:
http://en.wikibooks.org/wiki/Java_Programming/Keywords/instanceof

Ale silnie doradzam przemyślenie struktury tego projektu.

0

@Xender ale jak to sortowanie miałoby działać? POMYŚL! Jak będę miał w liście plik binarny i nie binarny i sortuje po kodowaniu to jak chcesz te dwa pliki ze sobą porównać skoro jeden ma takie pole a drugi go nie ma?

1

Przy odrobinie refleksji wszystko się da: http://ideone.com/pa1pBv
Hue, hue :P

Sortowanie najpierw po polu nazwa, potem po typie, potem po ekstra polach.

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