Ing sawijining dina ing universitas, aku kudu nulis kode kanggo ngurutake jeneng mburi kanca-kancaku, sing dadi kunci data pribadhi, kanthi urutan munggah. Aku ngginakaken kathah wektu iki. Nanging yen aku ngerti babagan kelas TreeMap , aku bakal ngrampungake tugas luwih cepet.

Apa iku TreeMap ? Iku struktur data kaya kamus sing nyimpen unsur minangka pasangan kunci-nilai, ngurutake miturut kunci.

Where lan carane bisa digunakake? Inggih, mesthine cocok kanggo tugas sing padha karo jeneng mburi kanca-kancaku. Yen aku kudu nyimpen nilai ing urutan munggah, tinimbang nulis algoritma ngurutake dhewe, kabeh aku kudu nggawe TreeMap lan sijine nilai ing.

Iki ngurutake jinis kayata Integer lan String kanthi urutan munggah. Nanging yen sampeyan pengin sijine jinis adat dhewe ing TreeMap , banjur kelas sampeyan kudu ngleksanakake antarmuka Comparable , supaya iku ngleksanakake compareTo () cara, kang nuduhake carane ngurutake kedadean kelas.


public class Person implements Comparable<Person> {
 
    private String firstName;
    private String lastName;
 
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
  …
 
    @Override
    public int compareTo(Person person) {
        return person.getFirstName().compareTo(firstName);
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}

Ayo ngganti metode compareTo () supaya ngurutake nilai kanthi jeneng ngarep ing urutan alfabet mbalikke:


TreeMap map = new TreeMap<Person, String>();
 
map.put(new Person("AA","BB"), "aa");
map.put(new Person("BB","BB"), "aa");
map.put(new Person("DD","BB"), "aa");
map.put(new Person("CC","BB"), "aa");

Nilai bakal disimpen ing urutan ing ngisor iki:


Person{firstName='DD', lastName='BB'}
Person{firstName='CC', lastName='BB'}
Person{firstName='BB', lastName='BB'}
Person{firstName='AA', lastName='BB'}

Kelas TreeMap ngleksanakake antarmuka NavigableMap , sing uga ngluwihi antarmuka SortedMap . Iki ngidini kelas TreeMap nggunakake wit kanggo nyimpen nilai ing urutan sing diurutake.

Minangka Wikipedia ngandika, wit minangka struktur telusuran binar sing ngimbangi dhewe sing nyimpen data ing simpul kasebut sawise mbandhingake nilai.

Ing tembung sing prasaja, wit abang-ireng minangka struktur data sing nyimpen nilai ing subtree tengen yen luwih gedhe tinimbang oyod, lan ing subtree kiwa yen kurang. Implementasi iki bisa nggoleki nilai-nilai ing struktur kanthi cepet.

A wit abang-ireng iku poto-imbangan, supaya ngganti struktur minangka saben nilai anyar dilebokake. Nilai sing ditambahake pisanan dianggep minangka oyod, nanging nilai liyane bisa dadi oyod sajrone proses imbangan.

Saiki sampeyan ngerti apa TreeMap lan cara kerjane.

Elinga yen TreeMap mung bisa nyimpen obyek sing kelas ngleksanakake antarmuka Comparable lan ngalahake cara compareTo () .

Nanging kepiye yen kita nggunakake kelas pihak katelu sing dimuat saka macem-macem perpustakaan lan ora bisa ngetrapake Comparable ing? Ana solusi kanggo iki: nulis Comparator dhewe .

Comparator iku sawijining antarmuka sing wis mbandhingaké () cara. Kita bisa digunakake kanggo mbandhingake obyek lan nyimpen ing TreeMap .


Comparator<Person> comparator = new Comparator<Person>() {
 
    @Override
    public int compare(Person person1, Person person2) {
        return person1.getFirstName().compareTo(person2.getFirstName());
    }
};
 
 
TreeMap map = new TreeMap<Person, String>(comparator);

Ing conto iki, kita nggawe Comparator khusus lan ngliwati TreeMap menyang kelas.

Miwiti ing Jawa 8, kita bisa nulis iki nggunakake ekspresi lambda:


TreeMap map = new TreeMap<Person, String>((Person person1, Person person2) -> person1.getFirstName().compareTo(person2.getFirstName()));

Ing tembung liyane, kanggo nyimpen nilai ing TreeMap , sampeyan kudu nemtokake cara ngurutake. Ana rong cara kanggo nindakake iki: ngleksanakake Comparable utawa ngleksanakake Comparator dhewe .

Nanging apa yen kita kudu sijine null menyang TreeMap minangka kunci? HashMap ngidini sampeyan nindakake iki. Ya, nanging kepiye carane TreeMap nangani iki?


TreeMap map = new TreeMap<Person, String>();
map.put (null, "Person");

Mbukak kode iki menehi kesalahan:

Pangecualian ing thread "utama" java.lang.NullPointerException ing java.base/java.util.TreeMap.put(TreeMap.java:561)

Masalah iku internal kelas TreeMap mbandhingake nilai nggunakake metode compareTo () . Sampeyan mesthi bisa ngliwati nilai null lan kode bakal dikompilasi. Nanging nalika runtime sampeyan bakal entuk kesalahan, amarga cara kasebut bakal diarani nilai null , nyebabake NullPointerException dibuwang.

Perbandingan HashMap lan TreeMap

Ora kaya TreeMap , HashMap ngidini sampeyan nyimpen null minangka kunci. Struktur nduweni panggonan tartamtu kanggo kabeh tombol null . HashMap bisa nyimpen tombol null amarga nemtokake endi sing dituju adhedhasar nilai hash, lan ngitung nilai hash ora mbutuhake mbandhingake. Dadi kabeh tombol null duwe panggonan.

Ana sampeyan duwe - saiki sampeyan ngerti apa sing kudu digunakake nalika sampeyan kudu nyimpen nilai ing urutan sing diurutake, lan carane nyetel aturan kanggo ngurutake.