• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie TreeMap

Object Storage Arubacloud
0 głosów
112 wizyt
pytanie zadane 13 marca 2023 w Java przez Mikołaj Pątkowski Użytkownik (530 p.)

Hej, piszę program w Javie typu Bookshop, w którym można dodawać/usuwać książki. Książki chciałem przechowywać w treeMap, jako klucz-nr isbn i wartość-obiekt książka.

Klasa książka:

public class Book implements Serializable{
    private String title;
    private String isbn;
    private String author;
    private int quan;   // ilość
    // [metody]
}

Klasa Bookshop:

public class Bookshop{
    private TreeMap <String, Book> bookList;
    // itd.
}

Chciałbym móc sortować TreeMap na różne sposoby, po title, author itd. Nie za bardzo wiem jak to zrobić, i tutaj proszę o pomoc. O ile w List i Set wiem jak to zrobić (interfejsem Comparator), to w mapach nie.

2 odpowiedzi

+2 głosów
odpowiedź 13 marca 2023 przez Wiciorny Ekspert (270,110 p.)
wybrane 14 marca 2023 przez Mikołaj Pątkowski
 
Najlepsza

Żeby własny obiekt sortować po czymś, musisz stworzyć własny comparator... 
Albo poprzez implementacje interfejsu przez klase  ( BookShopComparator implements Comparator<BookShop >)

 

class BookShopComparator implements Comparator<BookShop> {
    public int compare(Student s1, Student s2)
    {
        return s2.someFunction().compareTo(s1.someFunction()); // wlasna logika porwonania
    }
}

a potem wykorzystywac to jako 
 

    TreeMap<String, BookShop> map
            = new TreeMap<>(new BookShopComparator());


Inna opcja, to implementacja Comparable<BookShop> dla obiektów klasy BookShop i implementacja metody 
 

 // Implement the compareTo() method of the Comparable interface
    @Override
    public int compareTo(BookShop other) {
        return Integer.compare(this.id, other.getId()); // wlasna logika
    }

Zbudować możesz kilka comparatorów i tak je wykorzystywać, przsyłając odpowiednie implementacje.

https://www.baeldung.com/java-comparator-comparable

0 głosów
odpowiedź 14 marca 2023 przez Mikołaj Pątkowski Użytkownik (530 p.)

Posłużyłem się podpowiedzią @Wiciorny, ale też nie do końca. Przeczytałem gdzieś w internecie, że TreeMap nie sortuje się po prostu po wartościach, co chciałem zrobić, tylko jedynie po kluczach. Dlatego postalowiłem posortowane książki wsadzać do SortedSet, który w konstruktorze bierze obiekt Comparable.

public class TitleCompare implements Comparator<Map.Entry<String, Book>>{
    // Comparator porównujący po tytułach książek
    @Override
    public int compare(Map.Entry<String, Book> e1,
                       Map.Entry<String, Book> e2) {
        return e1.getValue().getTitle().compareTo(e2.getValue().getTitle());
    }
}

Następnie do klasy Bookshop dodałem funkcję, która tworzy i zwraca posortowany set

    public SortedSet<Map.Entry<String, Book>> sortTitle(){
        SortedSet<Map.Entry<String, Book>> set = new TreeSet<>(new TitleCompare());
        set.addAll(bookList.entrySet());
        return set;
    }

Odpowiedź @Wiciorny była wartościowa, ale z tego co rozumiem polegała na sortowaniu kolekcji obiektów typu Bookshop, natomiast ja chciałem sortować mapę booklist, która była zawarta w obiekcie bookshop

Podobne pytania

0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 23 stycznia 2021 w Java przez Kazek Początkujący (460 p.)
0 głosów
1 odpowiedź 355 wizyt
pytanie zadane 30 lipca 2020 w Java przez lucyliu Początkujący (370 p.)
0 głosów
1 odpowiedź 448 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...