Tìm hiểu SortedMap interface trong Java

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

https://www.geeksforgeeks.org/sortedmap-java-examples/

http://tutorials.jenkov.com/java-collections/sortedmap.html

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x