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

Sortowanie TreeMap

Cloud VPS
0 głosów
184 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 (281,530 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 234 wizyt
pytanie zadane 23 stycznia 2021 w Java przez Kazek Początkujący (460 p.)
0 głosów
1 odpowiedź 618 wizyt
pytanie zadane 30 lipca 2020 w Java przez lucyliu Początkujący (370 p.)
0 głosów
1 odpowiedź 660 wizyt

93,469 zapytań

142,404 odpowiedzi

322,715 komentarzy

62,852 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

Kursy INF.02 i INF.03
...