Jika anda membaca artikel ini, kemungkinan besar anda sudah biasa dengan antara muka Peta dan kegunaannya. Jika tidak, maka di sini anda pergi. Hari ini kita akan bercakap tentang ciri pelaksanaan TreeMap, dan lebih khusus lagi, bagaimana ia berbeza daripada HashMap dan cara menggunakannya dengan betul.
Seperti yang anda lihat, kelas ini mempunyai banyak persamaan, tetapi terdapat juga beberapa perbezaan. Walaupun kelas
Pencarian untuk elemen yang diperlukan bermula dari akar pokok, dalam kes kami adalah 61. Seterusnya, perbandingan dibuat dengan nilai yang diperlukan. Jika nilai kita kurang, kita ke kiri, jika lebih, kita ke kanan. Ini berlaku sehingga kita menemui nilai yang diperlukan atau memukul elemen dengan nilai
Perbandingan TreeMap, HashMap dan LinkedHashMap
Pelaksanaan antara muka Peta yang paling biasa digunakan ialah HashMap . Ia mudah digunakan dan menjamin akses pantas kepada data, menjadikannya calon terbaik untuk kebanyakan tugas. Kebanyakan, tetapi tidak semua. Kadangkala adalah perlu untuk menyimpan data dalam bentuk berstruktur dengan keupayaan untuk menavigasi melaluinya. Dalam kes ini, satu lagi pelaksanaan antara muka Peta datang untuk menyelamatkan - TreeMap . TreeMap melaksanakan antara muka NavigableMap , yang mewarisi daripada SortedMap , yang seterusnya mewarisi daripada antara muka Peta . Dengan melaksanakan antara muka NavigableMap dan SortedMap , TreeMap memperoleh kefungsian tambahan yang HashMap tidak , tetapi ini memerlukan kos dalam prestasi. Terdapat juga kelas LinkedHashMap , yang juga membolehkan anda menyimpan data dalam susunan tertentu - mengikut susunan data itu ditambahkan. Untuk membantu anda memahami perbezaan antara tiga kelas ini, lihat jadual ini:HashMap | LinkedHashMap | Peta Pokok | |
---|---|---|---|
Pesanan storan data | rawak. Tiada jaminan bahawa pesanan akan dikekalkan dari semasa ke semasa. | Dalam susunan penambahan | Dalam tertib menaik atau berdasarkan pembanding yang diberikan |
Masa capaian elemen | O(1) | O(1) | O(log(n)) |
Antara muka yang dilaksanakan | Peta | Peta | NavigableMap SortedMap Map |
Pelaksanaan berdasarkan struktur data | baldi | baldi | Pokok Merah-Hitam |
Keupayaan untuk bekerja dengan kekunci null | boleh | boleh | Ia mungkin jika anda menggunakan pembanding yang membenarkan null |
Benang selamat | Tidak | Tidak | Tidak |
TreeMap
adalah yang paling pelbagai fungsi, ia tidak boleh sentiasa disimpan null
sebagai kunci. Di samping itu, masa akses kepada elemen TreeMap akan menjadi yang paling lama. Oleh itu, jika anda tidak perlu menyimpan data dalam bentuk yang disusun, lebih baik menggunakan HashMap
atau LinkedHashMap
.
Pokok kayu hitam merah
Seperti yang mungkin anda perhatikan, di bawah tudungTreeMap
ia menggunakan struktur data yang dipanggil pokok merah-hitam. Ia adalah penyimpanan data dalam struktur ini yang memastikan susunan data disimpan. Apakah pokok ini? Mari kita fikirkan! Bayangkan anda perlu menyimpan pasangan Number-String. Nombor 16, 20, 52, 55, 61, 65, 71, 76, 81, 85, 90, 93, 101 akan menjadi kunci. Jika anda menyimpan data dalam senarai tradisional dan perlu mencari elemen dengan kunci 101, anda perlu mengulangi kesemua 13 elemen untuk mencarinya. Untuk 13 elemen ini tidak kritikal; apabila bekerja dengan sejuta kita akan menghadapi masalah besar. Untuk menyelesaikan masalah tersebut, pengaturcara menggunakan struktur data yang lebih kompleks sedikit. Oleh itu, bertemu pokok merah-hitam!
https://algorithmtutor.com/Data-Structures/Tree/Red-Black-Trees/
null
(daun pokok). Warna merah dan hitam digunakan untuk menjadikan pokok lebih mudah dinavigasi dan mengimbangi. Terdapat peraturan yang mesti sentiasa diikuti semasa membina pokok merah-hitam:
- Akar hendaklah berwarna hitam.
- Daun pokok itu hendaklah berwarna hitam.
- Nod merah mesti mempunyai dua nod anak hitam.
- Nod hitam boleh mempunyai sebarang nod anak.
- Laluan dari nod ke daunnya mesti mengandungi bilangan nod hitam yang sama.
- Nod baru ditambah sebagai ganti daun.
TreeMap
.
Kaedah yang diperoleh daripada antara muka SortedMap dan NavigableMap
SepertiHashMap
, TreeMap
ia melaksanakan antara muka Map
, yang bermaksud bahawa ia TreeMap
mempunyai semua kaedah yang HashMap
. Tetapi sebagai tambahan, TreeMap
ia melaksanakan antara muka SortedMap
dan NavigableMap
, mendapatkan fungsi tambahan daripada mereka. SortedMap
— antara muka yang memanjangkan Map
dan menambah kaedah yang berkaitan dengan set data yang diisih:
firstKey()
: mengembalikan kunci elemen pertama peta;lastKey()
: mengembalikan kunci elemen terakhir;headMap(K end)
: mengembalikan peta yang mengandungi semua elemen semasa, dari awal hingga elemen dengan kunciend
;tailMap(K start)
: mengembalikan peta yang mengandungi semua elemen semasa, bermula dengan elemenstart
dan berakhir dengan penghujung;subMap(K start, K end)
: mengembalikan peta yang mengandungi semua elemen semasa, bermula dengan elemenstart
dan berakhir dengan elemen dengan kunciend
.
NavigableMap
— antara muka yang memanjangkan SortedMap
dan menambah kaedah untuk menavigasi antara elemen peta:
firstEntry()
: mengembalikan pasangan nilai kunci pertama;lastEntry()
: mengembalikan pasangan nilai kunci terakhir;pollFirstEntry()
: mengembalikan dan mengeluarkan pasangan pertama;pollLastEntry()
: mengembalikan dan mengeluarkan pasangan terakhir;ceilingKey(K obj)
: Mengembalikan kunci terkecil k yang lebih besar daripada atau sama dengan obj kunci. Jika tiada kunci sedemikian, mengembalikan null;floorKey(K obj)
: Mengembalikan kunci terbesar k yang kurang daripada atau sama dengan obj kunci. Jika tiada kunci sedemikian, mengembalikan null;lowerKey(K obj)
: Mengembalikan kunci terbesar k yang lebih kecil daripada obj kunci. Jika tiada kunci sedemikian, mengembalikan null;higherKey(K obj)
: Mengembalikan kunci terkecil k yang lebih besar daripada obj kunci. Jika tiada kunci sedemikian, mengembalikan null;ceilingEntry(K obj)
: serupa dengan kaedah ceilingKey(K obj), tetapi mengembalikan pasangan nilai kunci (atau null);floorEntry(K obj)
: serupa dengan kaedah floorKey(K obj), tetapi mengembalikan pasangan nilai kunci (atau null);lowerEntry(K obj)
: serupa dengan kaedah lowerKey(K obj), tetapi mengembalikan pasangan nilai kunci (atau null);higherEntry(K obj)
: serupa dengan kaedah higherKey(K obj), tetapi mengembalikan pasangan nilai kunci (atau null);descendingKeySet()
: mengembalikan NavigableSet yang mengandungi semua kunci yang diisih dalam susunan terbalik;descendingMap()
: mengembalikan NavigableMap yang mengandungi semua pasangan yang diisih dalam susunan terbalik;navigableKeySet()
: mengembalikan objek NavigableSet yang mengandungi semua kunci dalam susunan storan;headMap(K upperBound, boolean incl)
: mengembalikan peta yang mengandungi pasangan dari awal hingga elemen upperBound. Argumen incl menentukan sama ada elemen upperBound harus disertakan dalam peta yang dikembalikan;tailMap(K lowerBound, boolean incl)
: kefungsian adalah serupa dengan kaedah sebelumnya, hanya pasangan dari lowerBound hingga akhir dikembalikan;subMap(K lowerBound, boolean lowIncl, K upperBound, boolean highIncl)
: Seperti dalam kaedah sebelumnya, pasangan dari lowerBound ke upperBound dikembalikan, argumen lowIncl dan highIncl menentukan sama ada untuk memasukkan elemen sempadan dalam peta baharu.
TreeMap
, sebagai tambahan kepada pembina yang kita kenali, satu lagi ditambah, yang menerima contoh pembanding. Pembanding ini akan bertanggungjawab untuk susunan unsur-unsur disimpan.
Contoh penggunaan TreeMap
Banyak kaedah tambahan seperti itu mungkin kelihatan tidak perlu, tetapi selalunya mereka ternyata lebih berguna daripada yang kelihatan pada mulanya. Mari lihat contoh ini bersama anda. Bayangkan bahawa kami bekerja di bahagian pemasaran sebuah syarikat besar, dan kami mempunyai pangkalan data orang yang kami ingin tunjukkan pengiklanan. Terdapat dua nuansa untuk ini:- kita perlu menjejaki bilangan tera kepada setiap orang;
- Algoritma untuk memaparkan pengiklanan kepada kanak-kanak bawah umur adalah berbeza.
Person
yang akan menyimpan semua maklumat yang tersedia kepada kita tentang seseorang:
public class Person {
public String firstName;
public String lastName;
public int age;
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
Kami melaksanakan logik dalam kelas Main
:
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<Person, Integer> map = new TreeMap<>(Comparator.comparingInt(o -> o.age));
map.put(new Person("John", "Smith", 17), 0);
map.put(new Person("Ivan", "Petrenko", 65), 0);
map.put(new Person("Pedro", "Escobar", 32), 0);
map.put(new Person("Radion", "Pyatkin", 14), 0);
map.put(new Person("Sergey", "Vashkevich", 19), 0);
Person firstAdultPerson = map.navigableKeySet().stream().filter(person -> person.age>18).findFirst().get();
Map<Person, Integer> youngPeopleMap = map.headMap(firstAdultPerson, false);
Map<Person, Integer> adultPeopleMap = map.tailMap(firstAdultPerson, true);
showAdvertisementToYoung(youngPeopleMap);
showAdvertisementToAdult(adultPeopleMap);
}
public static void showAdvertisementToYoung(Map map){}
public static void showAdvertisementToAdult(Map map){}
}
Dalam kelas Main
yang kami buat TreeMap
, di manakah key
orang tertentu, dan value
ialah bilangan tera iklan bulan ini. Dalam pembina kita lulus pembanding yang akan menyusun orang mengikut umur. Isikan dengan map
nilai rawak. Kini kami perlu mendapatkan rujukan kepada orang dewasa pertama dalam stor data mini kami. Kami melakukan ini menggunakan API Strim. Selepas ini, kami mendapat dua peta bebas, yang kami berikan kepada kaedah yang memaparkan pengiklanan. Terdapat banyak cara untuk menyelesaikan masalah ini. Kumpulan kaedah kelas TreeMap
membolehkan anda mencipta penyelesaian untuk memenuhi setiap citarasa. Ia tidak perlu mengingati semuanya, kerana anda sentiasa boleh menggunakan dokumentasi atau petunjuk dari persekitaran pembangunan. Itu sahaja! Saya harap kelas itu kini TreeMap
jelas kepada anda, dan anda akan mendapati aplikasi yang tepat untuknya dalam menyelesaikan masalah praktikal.
GO TO FULL VERSION