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

Sortowanie TreeMap

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
56 wizyt
pytanie zadane 13 marca w Java przez Mikołaj Pątkowski Początkujący (300 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 przez Wiciorny Ekspert (251,570 p.)
wybrane 14 marca 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 przez Mikołaj Pątkowski Początkujący (300 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 99 wizyt
pytanie zadane 23 stycznia 2021 w Java przez Kazek Początkujący (460 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 30 lipca 2020 w Java przez lucyliu Początkujący (370 p.)
0 głosów
1 odpowiedź 253 wizyt

90,871 zapytań

139,546 odpowiedzi

313,822 komentarzy

60,356 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...