Mục lục
SortedMap là một interface trong collection framework. Nó là một interface thừa kế từ Map interface có đầy đủ các chức năng mà Map định nghĩa, ngoài ra các phần tử trong SortedMap sẽ được sắp xếp theo thứ tự của key, mà một trong những implementation điển hình của nó là TreeMap.
Đặc điểm chính của SortedMap là nó sắp xếp thứ tự các key theo thứ tự tự nhiên của chúng hoặc một bộ triển khai so sánh các key được chỉ định. Vì vậy, hãy cân nhắc sử dụng TreeMap khi bạn muốn có một Map đáp ứng các tiêu chí sau:
- Key hoặc value đều không được NULL.
- Các key được sắp xếp theo thứ tự tự nhiên hoặc theo một bộ so sánh được chỉ định cụ thể.
Các sub-interface của SortedMap có thể kể đến như ConcurrentNavigableMap<K, V>, NavigableMap<K, V>.
Các implementation của SortedMap như ConcurrentSkipListMap, TreeMap.
Khai báo SortedMap trong collection framework.
public interface SortedMap<K, V> extends Map<K, V> { Comparator comparator(); SortedMap subMap(K fromKey, K toKey); SortedMap headMap(K toKey); SortedMap tailMap(K fromKey); K firstKey(); K lastKey(); }
SortedMap là một interface vì thế chúng ta không thể khởi tạo trực tiếp mà phải thông qua một implementation của nó, trong phần này mình sẽ sử dụng TreeMap.
import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; public class SortedMapExample { public static void main(String[] args) { SortedMap<Integer, String> sm = new TreeMap<Integer, String>(); sm.put(new Integer(2), "practice"); sm.put(new Integer(3), "quiz"); sm.put(new Integer(5), "code"); sm.put(new Integer(4), "contribute"); sm.put(new Integer(1), "deftblog"); Set s = sm.entrySet(); // Using iterator in SortedMap Iterator i = s.iterator(); // Traversing map. Note that the traversal // produced sorted (by keys) output . while (i.hasNext()) { Map.Entry m = (Map.Entry)i.next(); int key = (Integer)m.getKey(); String value = (String)m.getValue(); System.out.println("Key : " + key + " value : " + value); } } }
Output
Key : 1 value : deftblog Key : 2 value : practice Key : 3 value : quiz Key : 4 value : contribute Key : 5 value : code
Các thao tác cơ bản trên SortedMap
Thêm phần tử
Để thêm một phần tử vào SortedMap, chúng ta có thể sử dụng phương thức put (). Tuy nhiên, thứ tự chèn không được giữ lại trong SortedMap. Bên trong, đối với mọi phần tử, các khóa được so sánh và sắp xếp theo thứ tự tăng dần.
import java.io.*; import java.util.*; class GFG { // Main Method public static void main(String args[]) { // Default Initialization of a // SortedMap SortedMap tm1 = new TreeMap(); // Initialization of a SortedMap // using Generics SortedMap<Integer, String> tm2 = new TreeMap<Integer, String>(); // Inserting the Elements tm1.put(3, "Deft"); tm1.put(2, "For"); tm1.put(1, "Deft"); tm2.put(new Integer(3), "Deft"); tm2.put(new Integer(2), "For"); tm2.put(new Integer(1), "Deft"); System.out.println(tm1); System.out.println(tm2); } }
Output
{1=Deft, 2=For, 3=Deft} {1=Deft, 2=For, 3=Deft}
Cập nhật
Sau khi thêm các phần tử nếu chúng ta muốn thay đổi phần tử, nó có thể được thực hiện bằng cách thêm lại phần tử với phương thức put (). Vì các phần tử trong SortedMap sắp xếp được lập chỉ mục bằng cách sử dụng các key, nên giá trị của key có thể được thay đổi bằng cách chỉ cần chèn giá trị đã cập nhật cho key mà chúng ta muốn thay đổi.
import java.io.*; import java.util.*; class GFG { // Main Method public static void main(String args[]) { // Initialization of a SortedMap // using Generics SortedMap<Integer, String> tm = new TreeMap<Integer, String>(); // Inserting the Elements tm.put(3, "Deft"); tm.put(2, "Deft"); tm.put(1, "Deft"); System.out.println(tm); tm.put(2, "For"); System.out.println(tm); } }
Output
{1=Deft, 2=Deft, 3=Deft} {1=Deft, 2=For, 3=Deft}
Xóa phần tử
Để xóa một phần tử khỏi SortedMap, chúng ta có thể sử dụng phương thức remove (). Phương thức này nhận giá trị key và xóa ánh xạ cho khóa khỏi Map sắp xếp này nếu nó tồn tại.
import java.io.*; import java.util.*; class GFG { // Main Method public static void main(String args[]) { // Initialization of a SortedMap // using Generics SortedMap<Integer, String> tm = new TreeMap<Integer, String>(); // Inserting the Elements tm.put(3, "Deft"); tm.put(2, "Deft"); tm.put(1, "Deft"); tm.put(4, "For"); System.out.println(tm); tm.remove(4); System.out.println(tm); } }
Output
{1=Deft, 2=Deft, 3=Deft, 4=For} {1=Deft, 2=Deft, 3=Deft}
Duyệt SortedMap
Có nhiều cách để duyệt qua SortedMap. Cách nổi tiếng nhất là sử dụng vòng lặp for nâng cao và lấy các key. Giá trị của khóa được tìm thấy bằng cách sử dụng phương thức getValue ().
import java.util.*; class GFG { // Main Method public static void main(String args[]) { // Initialization of a SortedMap // using Generics SortedMap<Integer, String> tm = new TreeMap<Integer, String>(); // Inserting the Elements tm.put(3, "Deft"); tm.put(2, "For"); tm.put(1, "Deft"); for (Map.Entry mapElement : tm.entrySet()) { int key = (int)mapElement.getKey(); // Finding the value String value = (String)mapElement.getValue(); System.out.println(key + " : " + value); } } }
Output
1 : Deft 2 : For 3 : Deft
Duyệt theo chiều giảm dần
Hãy nhớ rằng, nếu bạn muốn lặp lại các key theo thứ tự giảm dần thay vì thứ tự tăng dần, hãy sử dụng phương thức sortedMap.descendingKeySet(). Iterator(), như sau:
SortedMap sortedMap = new TreeMap(); sortedMap.put("a", "one"); sortedMap.put("b", "two"); sortedMap.put("c", "three"); Iterator iterator = sortedMap.descendingKeySet().iterator(); while(iterator.hasNext()) { String key = (String) iterator.next(); String value = (String) sortedMap.get(key); }
Nguồn tham khảo