Trong hướng dẫn này, chúng ta sẽ tìm hiểu về lớp Java TreeMap và các hoạt động của nó với sự trợ giúp của các ví dụ.
Các TreeMap
lớp học của khuôn khổ bộ sưu tập Java cung cấp việc thực hiện cây cấu trúc dữ liệu.
Nó thực hiện giao diện NavigableMap.
Tạo sơ đồ cây
Để tạo một TreeMap
, java.util.TreeMap
trước tiên chúng ta phải nhập gói. Sau khi chúng tôi nhập gói, đây là cách chúng tôi có thể tạo một TreeMap
trong Java.
TreeMap numbers = new TreeMap();
Trong đoạn mã trên, chúng tôi đã tạo một TreeMap
số được đặt tên mà không có bất kỳ đối số nào. Trong trường hợp này, các phần tử trong TreeMap
được sắp xếp tự nhiên (thứ tự tăng dần).
Tuy nhiên, chúng ta có thể tùy chỉnh việc sắp xếp các phần tử bằng cách sử dụng Comparator
giao diện. Chúng ta sẽ tìm hiểu về nó sau trong hướng dẫn này.
Đây,
- Khóa - một số nhận dạng duy nhất được sử dụng để liên kết từng phần tử (giá trị) trong bản đồ
- Giá trị - các yếu tố được liên kết bởi các khóa trong bản đồ
Phương thức của Bản đồ cây
Các TreeMap
lớp học cung cấp phương pháp khác nhau mà cho phép chúng tôi thực hiện các hoạt động trên bản đồ.
Chèn các phần tử vào Sơ đồ cây
put()
- chèn ánh xạ khóa / giá trị được chỉ định (mục nhập) vào bản đồputAll()
- chèn tất cả các mục từ bản đồ được chỉ định vào bản đồ nàyputIfAbsent()
- chèn ánh xạ khóa / giá trị được chỉ định vào bản đồ nếu khóa được chỉ định không có trong bản đồ
Ví dụ,
import java.util.TreeMap; class Main ( public static void main(String() args) ( // Creating TreeMap of even numbers TreeMap evenNumbers = new TreeMap(); // Using put() evenNumbers.put("Two", 2); evenNumbers.put("Four", 4); // Using putIfAbsent() evenNumbers.putIfAbsent("Six", 6); System.out.println("TreeMap of even numbers: " + evenNumbers); //Creating TreeMap of numbers TreeMap numbers = new TreeMap(); numbers.put("One", 1); // Using putAll() numbers.putAll(evenNumbers); System.out.println("TreeMap of numbers: " + numbers); ) )
Đầu ra
Sơ đồ cây của các số chẵn: (Bốn = 4, Sáu = 6, Hai = 2) Sơ đồ cây của các số: (Bốn = 4, Một = 1, Sáu = 6, Hai = 2)
Truy cập phần tử bản đồ cây
1. Sử dụng entrySet (), keySet () và các giá trị ()
entrySet()
- trả về một tập hợp tất cả ánh xạ khóa / giá trị (mục nhập) của một biểu đồ dạng câykeySet()
- trả về một tập hợp tất cả các khóa của bản đồ câyvalues()
- trả về một tập hợp tất cả các bản đồ của một bản đồ cây
Ví dụ,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // Using entrySet() System.out.println("Key/Value mappings: " + numbers.entrySet()); // Using keySet() System.out.println("Keys: " + numbers.keySet()); // Using values() System.out.println("Values: " + numbers.values()); ) )
Đầu ra
TreeMap: (Một = 1, Ba = 3, Hai = 2) Ánh xạ khóa / giá trị: (Một = 1, Ba = 3, Hai = 2) Khóa: (Một, Ba, Hai) Giá trị: (1, 3, 2 )
2. Sử dụng get () và getOrDefault ()
get()
- Trả về giá trị được liên kết với khóa được chỉ định. Trả về null nếu không tìm thấy khóa.getOrDefault()
- Trả về giá trị được liên kết với khóa được chỉ định. Trả về giá trị mặc định đã chỉ định nếu không tìm thấy khóa.
Ví dụ,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // Using get() int value1 = numbers.get("Three"); System.out.println("Using get(): " + value1); // Using getOrDefault() int value2 = numbers.getOrDefault("Five", 5); System.out.println("Using getOrDefault(): " + value2); ) )
Đầu ra
TreeMap: (Một = 1, Ba = 3, Hai = 2) Sử dụng get (): 3 Sử dụng getOrDefault (): 5
Ở đây, getOrDefault()
phương pháp không tìm thấy khóa Năm. Do đó, nó trả về giá trị mặc định được chỉ định 5.
Xóa các phần tử TeeMap
remove(key)
- trả về và xóa mục nhập được liên kết với khóa được chỉ định khỏi Sơ đồ câyremove(key, value)
- chỉ xóa mục nhập khỏi bản đồ nếu khóa được chỉ định được liên kết với giá trị được chỉ định và trả về giá trị boolean
Ví dụ,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("One", 1); numbers.put("Two", 2); numbers.put("Three", 3); System.out.println("TreeMap: " + numbers); // remove method with single parameter int value = numbers.remove("Two"); System.out.println("Removed value: " + value); // remove method with two parameters boolean result = numbers.remove("Three", 3); System.out.println("Is the entry (Three=3) removed? " + result); System.out.println("Updated TreeMap: " + numbers); ) )
Đầu ra
TreeMap: (Một = 1, Ba = 3, Hai = 2) Giá trị đã xóa = 2 Mục nhập (Ba = 3) có bị xóa không? Bản đồ cây được cập nhật thực sự: (Một = 1)
Thay thế các phần tử TreeMap
replace(key, value)
- thay thế giá trị được ánh xạ bởi khóa được chỉ định bằng giá trị mớireplace(key, old, new)
- chỉ thay thế giá trị cũ bằng giá trị mới nếu giá trị cũ đã được liên kết với khóa được chỉ địnhreplaceAll(function)
- thay thế mỗi giá trị của bản đồ bằng kết quả của hàm được chỉ định
Ví dụ,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("Original TreeMap: " + numbers); // Using replace() numbers.replace("Second", 22); numbers.replace("Third", 3, 33); System.out.println("TreeMap using replace: " + numbers); // Using replaceAll() numbers.replaceAll((key, oldValue) -> oldValue + 2); System.out.println("TreeMap using replaceAll: " + numbers); ) )
Đầu ra
Original TreeMap: (First=1, Second=2, Third=3) TreeMap using replace(): (First=1, Second=22, Third=33) TreeMap using replaceAll(): (First=3, Second=24, Third=35)
In the above program notice the statement
numbers.replaceAll((key, oldValue) -> oldValue + 2);
Here, we have passed a lambda expression as an argument.
The replaceAll()
method accesses all the entries of the map. It then replaces all the elements with the new values (returned from the lambda expression).
Methods for Navigation
Since the TreeMap
class implements NavigableMap
, it provides various methods to navigate over the elements of the treemap.
1. First and Last Methods
firstKey()
- returns the first key of the mapfirstEntry()
- returns the key/value mapping of the first key of the maplastKey()
- returns the last key of the maplastEntry()
- returns the key/value mapping of the last key of the map
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); // Using the firstKey() method String firstKey = numbers.firstKey(); System.out.println("First Key: " + firstKey); // Using the lastKey() method String lastKey = numbers.lastKey(); System.out.println("Last Key: " + lastKey); // Using firstEntry() method System.out.println("First Entry: " + numbers.firstEntry()); // Using the lastEntry() method System.out.println("Last Entry: " + numbers.lastEntry()); ) )
Output
TreeMap: (First=1, Second=2, Third=3) First Key: First Last Key: Third First Entry: First=1 Last Entry: Third=3
2. Ceiling, Floor, Higher and Lower Methods
- higherKey() - Returns the lowest key among those keys that are greater than the specified key.
- higherEntry() - Returns an entry associated with a key that is lowest among all those keys greater than the specified key.
- lowerKey() - Returns the greatest key among all those keys that are less than the specified key.
- lowerEntry() - Returns an entry associated with a key that is greatest among all those keys that are less than the specified key.
- ceilingKey() - Returns the lowest key among those keys that are greater than the specified key. If the key passed as an argument is present in the map, it returns that key.
- ceilingEntry() - Returns an entry associated with a key that is lowest among those keys that are greater than the specified key. It an entry associated with the key passed an argument is present in the map, it returns the entry associated with that key.
- floorKey() - Returns the greatest key among those keys that are less than the specified key. If the key passed as an argument is present, it returns that key.
- floorEntry() - Returns an entry associated with a key that is greatest among those keys that are less than the specified key. If the key passed as argument is present, it returns that key.
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 5); numbers.put("Third", 4); numbers.put("Fourth", 6); System.out.println("TreeMap: " + numbers); // Using higher() System.out.println("Using higherKey(): " + numbers.higherKey("Fourth")); System.out.println("Using higherEntry(): " + numbers.higherEntry("Fourth")); // Using lower() System.out.println("Using lowerKey(): " + numbers.lowerKey("Fourth")); System.out.println("Using lowerEntry(): " + numbers.lowerEntry("Fourth")); // Using ceiling() System.out.println("Using ceilingKey(): " + numbers.ceilingKey("Fourth")); System.out.println("Using ceilingEntry(): " + numbers.ceilingEntry("Fourth")); // Using floor() System.out.println("Using floorKey(): " + numbers.floorKey("Fourth")); System.out.println("Using floorEntry(): " + numbers.floorEntry("Fourth")); ) )
Output
TreeMap: (First=1, Fourth=6, Second=5, Third=4) Using higherKey(): Second Using higherEntry(): Second=5 Using lowerKey(): First Using lowerEntry(): First=1 Using ceilingKey(): Fourth Using ceilingEntry(): Fourth=6 Using floorkey(): Fourth Using floorEntry(): Fourth=6
3. pollFirstEntry() and pollLastEntry() Methods
pollFirstEntry()
- returns and removes the entry associated with the first key of the mappollLastEntry()
- returns and removes the entry associated with the last key of the map
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); System.out.println("TreeMap: " + numbers); //Using the pollFirstEntry() method System.out.println("Using pollFirstEntry(): " + numbers.pollFirstEntry()); // Using the pollLastEntry() method System.out.println("Using pollLastEntry(): " + numbers.pollLastEntry()); System.out.println("Updated TreeMap: " + numbers); ) )
Output
TreeMap: (First=1, Second=2, Third=3) Using pollFirstEntry(): First=1 Using pollLastEntry(): Third=3 Updated TreeMap: (Second=2)
4. headMap(), tailMap() and subMap() Methods
headMap(key, booleanValue)
The headMap()
method returns all the key/value pairs of a treemap before the specified key (which is passed as an argument).
The booleanValue parameter is optional. Its default value is false
.
If true
is passed as a booleanValue, the method also includes the key/value pair of the key
which is passed as an argument.
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("Using headMap() Method:"); // Using headMap() with default booleanValue System.out.println("Without boolean value: " + numbers.headMap("Fourth")); // Using headMap() with specified booleanValue System.out.println("With boolean value: " + numbers.headMap("Fourth", true)); ) )
Output
TreeMap: (First=1, Fourth=4, Second=2, Third=3) Using headMap() Method: Without boolean value: (First=1) With boolean value: (First=1, Fourth=4)
tailMap(key, booleanValue)
The tailMap()
method returns all the key/value pairs of a treemap starting from the specified key (which is passed as an argument).
The booleanValue is an optional parameter. Its default value is true
.
If false
is passed as a booleanValue, the method doesn't include the key/value pair of the specified key
.
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("Using tailMap() Method:"); // Using tailMap() with default booleanValue System.out.println("Without boolean value: " + numbers.tailMap("Second")); // Using tailMap() with specified booleanValue System.out.println("With boolean value: " + numbers.tailMap("Second", false)); ) )
Output
TreeMap: (First=1, Fourth=4, Second=2, Third=3) Using tailMap() Method: Without boolean value: (Second=2, Third=3) With boolean value: (Third=3)
subMap(k1, bV1, k2, bV2)
The subMap()
method returns all the entries associated with keys between k1 and k2 including the entry of k1.
The bV1 and bV2 are optional boolean parameters. The default value of bV1 is true
and the default value of bV2 is false
.
If false
is passed as bV1, the method returns all the entries associated with keys between k1 and k2 without including the entry of k1.
If true
is passed as bV2, the method returns all the entries associated with keys between k1 and k2 including the entry of k2.
For example,
import java.util.TreeMap; class Main ( public static void main(String() args) ( TreeMap numbers = new TreeMap(); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); System.out.println("Using subMap() Method:"); // Using subMap() with default booleanValue System.out.println("Without boolean value: " + numbers.subMap("Fourth", "Third")); // Using subMap() with specified booleanValue System.out.println("With boolean value: " + numbers.subMap("Fourth", false, "Third", true)); ) )
Output
TreeMap: (First=1, Fourth=2, Second=2, Third=3) Using subMap() Method: Without boolean value: (Fourth=4, Second=2) With boolean value: (Second=2, Third=3)
Other Methods of TreeMap
Method | Description |
---|---|
clone() | Creates a copy of the TreeMap |
containsKey() | Searches the TreeMap for the specified key and returns a boolean result |
containsValue() | Searches the TreeMap for the specified value and returns a boolean result |
size() | Returns the size of the TreeMap |
clear() | Removes all the entries from the TreeMap |
TreeMap Comparator
In all the examples above, treemap elements are sorted naturally (in ascending order). However, we can also customize the ordering of keys.
For this, we need to create our own comparator class based on which keys in a treemap are sorted. For example,
import java.util.TreeMap; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a treemap with a customized comparator TreeMap numbers = new TreeMap(new CustomComparator()); numbers.put("First", 1); numbers.put("Second", 2); numbers.put("Third", 3); numbers.put("Fourth", 4); System.out.println("TreeMap: " + numbers); ) // Creating a comparator class public static class CustomComparator implements Comparator ( @Override public int compare(String number1, String number2) ( int value = number1.compareTo(number2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) ) )
Output
TreeMap: (Third=3, Second=2, Fourth=4, First=1)
Trong ví dụ trên, chúng ta đã tạo một bản đồ dạng treemap truyền lớp CustomComparator làm đối số.
Lớp CustomComparator thực hiện Comparator
giao diện.
Sau đó, chúng tôi ghi đè compare()
phương thức để sắp xếp các phần tử theo thứ tự ngược lại.
Để tìm hiểu thêm, hãy truy cập Trình so sánh Java (tài liệu Java chính thức).