1. SortedSet trong Java là gì?

SortedSet trong Java là một Interface kế thừa lại từ Set Interface, nó được sử dụng để lưu trữ tập hợp các phần tử hay đối tượng mà trong đó các phẩn tử đã được sắp xếp sẵn theo thứ tự cụ thể bằng cách sử dụng Comparator. Khi khởi tạo một SortedSet chúng ta sẽ thường sử dụng lớp TreeSet() để triển khai một SortedSet khi được tạo.

SortedSet Interface được kế thừa lại từ Set Interface, thế nên các tính chất của SortedSet cũng được đảm bảo giống như Interface cha của nó. Các phần tử lưu trữ bên trong SortedSet cũng phải là duy nhất – điều này nghĩa là các phần tử bên trong SortedSet là các giá trị duy nhất giống như các hằng số. Tuy nhiên, SortedSet có được tính chất đặc biệt hơn Interface cha của nó đó là các phần tử sẽ được sắp xếp theo một thứ tự tăng dần hoặc giảm dần. Mặc định sẽ là tăng dần!

Chúng ta hoàn toàn có thể tìm thấy SortedSet trong thư viện java.util và để sử dụng được kiểu SortedSet trong Java ta chỉ cần nhập thư viện: import java.util.SortedSet;

2. Khai báo SortedSet trong Java

Khai báo một SortedSet trong Java ta chỉ cần khởi tạo Interface SortedSet với phần triển khai bởi lớp TreeSet() (đã được đề cập ở phần trên). Khi một SortedSet được khai báo (khởi tạo) thành công sẽ là một SortedSet rỗng. Các phần tử trong một SortedSet sẽ được lưu trữ bên trong cặp dấu ngoặc vuông [ ] – điều này tương tự như Interface Set cha của nó.

Dưới đây là câu lệnh khai báo khởi tạo một SortedSet mới sử dụng lớp TreeSet() để triển khai SortedSet đó:

//Khoi tao SortedSet su dung TreeSet()
SortedSet sortedSet = new TreeSet();

Ví dụ dưới đây, chúng ta sẽ cùng nhau khai báo một SortedSet mới dựa trên câu lệnh trên. Sau đó, ta sẽ cùng nhau kiểm tra xem SortedSet vừa khởi tạo có rỗng không bằng phương thức SortedSet.isEmpty() và hiển thị ra các phần tử có trong SortedSet vừa khởi tạo:

import java.util.SortedSet; 
import java.util.TreeSet; 
public class Main { 
    public static void main(String[] args) { 
        //Khoi tao mot sortedSet moi
        SortedSet sortedSet = new TreeSet();  
        //Kiem tra SortedSet vua tao co rong hay khong?
        boolean result = sortedSet.isEmpty();
        System.out.println("SortedSet vua tao co rong hay khong? \n" + result);
        //Kiem tra phan tu trong SortedSet
        System.out.println("Phan tu co trong SortedSet la: \n" + sortedSet);  
    }   
}

Kết quả:

SortedSet vua tao co rong hay khong?
true
Phan tu co trong SortedSet la:
[]

Lưu ý: Vì Interface SortedSet được kế thừa lại từ Interface Set, vậy nên chúng ta hoàn toàn có thể sử dụng được lại các phương thức của Set Interface. Như ở ví dụ trên, chúng ta đã sử dụng phương thức isEmpty() của Set để kiểm tra xem SortedSet vừa khởi tạo có rỗng hay không.

3. Thao tác với SortedSet trong Java

SortedSet trong Java cũng được coi như là một tập hợp có thứ tự. Chúng có thể hoàn toàn thực hiện các phép toán trên tập hợp như: giao hoán, phép hợp, phép trừ. Các ví dụ về phép toán trên tập hợp đối với SortedSet sẽ không được đưa ra ví dụ trong bài này (nếu bạn bạn quan tâm có thể xem lại phần 3.1 Thao tác với Set như một tập hợp để áp dụng cho SortedSet).

Trong bài này chúng ta sẽ chỉ thực hiện các thao tác thêm phần tử vào SortedSet, sắp xếp các phần tử trong SortedSet,  lấy ra phần tử đầu tiên trong SortedSet, lấy ra phần tử cuối cùng trong SortedSet….

3.1 Thêm phần tử vào SortedSet trong Java

Thao tác thêm phần tử sẽ đưa các phần tử được chỉ định vào trong SortedSet cần lưu trữ. Ngoài ra, với tính chất không lưu trữ các phần tử trùng nhau trong SortedSet nên các phần tử trùng lặp khi thêm vào SortedSet sẽ được bỏ qua. Các phần tử khi được thêm vào SortedSet sẽ được sắp xếp mặc định theo thứ tự tăng dần (tăng dần theo số từ 1 – 9 hoặc tăng dần theo bảng chữ cái từ A – Z)

Để thực hiện được việc thêm phần tử vào trong SortedSet ta sẽ chỉ cần gọi đến phương thức có sẵn SortedSet.add() – phương thức trả về true nếu thêm phần tử vào thành công, ngược lại phương thức sẽ trả về false.

import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
        //Khoi tao mot sortedSet moi
        SortedSet sortedSet = new TreeSet();   
        //Kiem tra SortedSet vua tao co rong hay khong?
        boolean result = sortedSet.isEmpty();
        System.out.println("SortedSet vua tao co rong hay khong? \n" + result); 
        //Kiem tra phan tu trong SortedSet
        System.out.println("Phan tu co trong SortedSet la: \n" + sortedSet);
        
        //Them phan tu vao SortedSet
        sortedSet.add("Audi");  
        sortedSet.add("BMW");  
        sortedSet.add("Mercedes");  
        sortedSet.add("Baleno");  
        
        //Kiem tra SortedSet sau khi them phan tu co rong khong?
        boolean result2 = sortedSet.isEmpty();
        System.out.println("SortedSet sau khi them phan tu co rong hay khong? \n" + result2); 
        //Kiem tra phan tu trong SortedSet
        System.out.println("Phan tu co trong SortedSet sau khi them la: \n" + sortedSet);
        
        //Duyet SortedSet bang vong lap for
        System.out.println("Duyet phan tu trong SortedSet: ");  
        for (Object object : sortedSet) {  
            System.out.println(object);  
        }  
    }    
}

Kết quả:

SortedSet vua tao co rong hay khong? 
true
Phan tu co trong SortedSet la: 
[]
SortedSet sau khi them phan tu co rong hay khong? 
false
Phan tu co trong SortedSet sau khi them la: 
[Audi, BMW, Baleno, Mercedes]
Duyet phan tu trong SortedSet: 
Audi
BMW
Baleno
Mercedes

3.2 Lấy phần tử đầu tiên của SortedSet trong Java

Phương thức SortedSet.first() trong Java được sử dụng để lấy ra phần tử đầu tiên có trong một SortedSet – nếu như một SortedSet được sắp xếp theo chiều mặc định tăng dần thì phần tử đầu tiên này cũng là phần tử có giá trị nhỏ nhất trong SortedSet.

Trong ví dụ dưới đây, chúng ta sẽ cùng nhau tạo một SortedSet lưu trữ các phần tử có kiểu số nguyên, sau đó thực hiện lấy ra phần tử đầu tiên của SortedSet thông qua phương thức SortedSet.first(). Kết quả nhận được sẽ là phần tử có giá trị nhỏ nhất có trong SortedSet khi được sắp xếp mặc định.

import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
    	//Khoi tao mot sortedSet moi
        SortedSet sortedSet = new TreeSet();   
        //Them phan tu vao SortedSet
        sortedSet.add(55);  
        sortedSet.add(77);  
        sortedSet.add(11);  
        sortedSet.add(99);  
        //Kiem tra phan tu trong SortedSet
        System.out.println("Phan tu co trong SortedSet la: \n" + sortedSet);
        //Duyet SortedSet bang vong lap for
        System.out.println("Duyet phan tu trong SortedSet: ");  
        for (Object object : sortedSet) {  
            System.out.println(object);  
        }  
        //Lay phan tu dau tien co trong SortedSet
        System.out.println ("Phan tu dau tien trong SortedSet la: " + sortedSet.first()); 
    }    
}

Kết quả:

Phan tu co trong SortedSet la: 
[11, 55, 77, 99]
Duyet phan tu trong SortedSet: 
11
55
77
99
Phan tu dau tien trong SortedSet la: 11

Lưu ý: Nếu như một SortedSet là rỗng, khi đó thực hiện phương thức SortedSet.first() sẽ ném ra một Throws NoSuchElementException.

3.3 Lấy ra phần tử cuối cùng của SortedSet trong Java

Phần trên chúng ta đã thực hiện phương thức để lấy ra phần tử đầu tiên trong SortedSet, vậy trong trường hợp cần lấy ra phần tử cuối cùng trong SortedSet thì sẽ sử dụng phương thức nào? Đó chính là phương thức SortedSet.last() – để lấy ra phần tử cuối cùng trong SortedSet.

Phần tử cuối cùng trong SortedSet khi được lấy ra sẽ là phần tử có giá trị lớn nhất trong SortedSet nếu như SortedSet đó được sắp xếp theo chiều mặc định tăng dần. Mời bạn cùng xem ví dụ dưới đây để hiểu rõ hơn về cách lấy ra phần tử cuối cùng trong SortedSet.

import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
    	//Khoi tao mot sortedSet moi
        SortedSet sortedSet = new TreeSet();   
        //Them phan tu vao SortedSet
        sortedSet.add("D");  
        sortedSet.add("C");  
        sortedSet.add("A");  
        sortedSet.add("B");  
        //Kiem tra phan tu trong SortedSet
        System.out.println("Phan tu co trong SortedSet la: \n" + sortedSet);
        //Duyet SortedSet bang vong lap for
        System.out.println("Duyet phan tu trong SortedSet: ");  
        for (Object object : sortedSet) {  
            System.out.println(object);  
        }  
        //Lay phan tu cuoi cung co trong SortedSet
        System.out.println ("Phan tu cuoi cung trong SortedSet la: " + sortedSet.last()); 
    }    
}

Kết quả:

Phan tu co trong SortedSet la: 
[A, B, C, D]
Duyet phan tu trong SortedSet: 
A
B
C
D
Phan tu cuoi cung trong SortedSet la: D

Phương thức SortedSet.last() cũng sẽ ném ra một Throws NoSuchElementException nếu như SortedSet cần lấy ra phần tử cuối cùng là rỗng.

3.4 Lấy ra một phần trong SortedSet

Ngoài việc lấy phần tử đầu và phần tử cuối của SortedSet mà ta đã đề cập ở trên, chúng ta cũng có thể lấy ra các phần tử trong một khoảng có trong SortedSet hoặc có thể lấy ra số lượng phần tử dựa vào điều kiện nhất định nào đó.

Trong đó, ba phương thức chính được giới thiệu dưới đây sẽ thường xuyên được sử dụng để trích xuất ra một phần số lượng phần tử có trong SortedSet:

  • Phương thức SortedSet.subset(E fromElement, E toElement) được sử dụng để lấy ra một số phần tử nằm trong khoảng chỉ định từ fromElement đến toElement.
import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
    	//Khoi tao SortedSet 
        SortedSet sortedSet = new TreeSet();   
        //Them phan tu vao SortedSet
        sortedSet.add(22);  
        sortedSet.add(55);  
        sortedSet.add(33);  
        sortedSet.add(44);  
        sortedSet.add(11);  
        System.out.println("Phan tu trong SortedSet la: ");  
        //Duyet qua cac phan tu trong SortedSet
        for (Object object : sortedSet) {  
            System.out.println(object);    
        }
        //Lay ra phan tu trong khoang 11 den 44
        System.out.println("Phan tu trong khoang 11 den 44 la: " + sortedSet.subSet(11, 44));     
    }  
}

Kết quả:

Phan tu trong SortedSet la: 
11
22
33
44
55
Phan tu trong khoang 11 den 44 la: [11, 22, 33]
  • Phương thức SortedSet.headSet(E toElement) được sử dụng để lấy ra phần tử đầu tiên đến phần tử đứng trước phần tử toElement.
import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
    	//Khoi tao 2 SortedSet 
        SortedSet <Integer> sortedSet1 = new TreeSet<Integer>();  
        SortedSet <Integer> sortedSet2 = new TreeSet<Integer>();  
        //Them phan tu vao sortedSet1
        sortedSet1.add(12);  
        sortedSet1.add(13);  
        sortedSet1.add(14);  
        sortedSet1.add(15);  
        sortedSet1.add(16);  
        sortedSet1.add(17);  
        //Hien thi cac phan tu trong sortedSet1
        System.out.println("Phan tu trong sortedSet1 la: "+ sortedSet1);  
        //Lay cac phan tu dung truoc phan tu 15 trong sortedSet1 sau do dua vao sortedSet2
        sortedSet2 = (TreeSet)sortedSet1.headSet(15);   
        System.out.println("Phan tu dung truoc phan tu 15 trong sortedSet2 la: "+ sortedSet2);  
    }  
}

Kết quả:

Phan tu trong sortedSet1 la: [12, 13, 14, 15, 16, 17]
Phan tu dung truoc phan tu 15 trong sortedSet2 la: [12, 13, 14]
  • Phương thức SortedSet.tailSet(E fromElement) được sử dụng để lấy ra phần tử bắt đầu từ phần tử lớn hơn fromElement đến hết các phần tử trong SortedSet.
import java.util.SortedSet;  
import java.util.TreeSet;  
public class Main {  
    public static void main(String[] args) {  
    	//Khoi tao sortedSet moi
        SortedSet sortedSet = new TreeSet();   
        //Them phan tu vao trong sortedSet
        sortedSet.add(56);  
        sortedSet.add(89);  
        sortedSet.add(54);  
        sortedSet.add(33);  
        sortedSet.add(32);  
        //Duyet sortedSet
        System.out.println("Phan tu co trong sortedSet la: ");  
        for (Object object : sortedSet) {  
            System.out.println(object);    
        }  
        //Lay ra phan tu bat dau tu 54 den het sortedSet
        System.out.println("Phan tu tu 54 den het sortedSet la: " + sortedSet.tailSet(54)); 
    }  
}

Kết quả:

Phan tu co trong sortedSet la: 
32
33
54
56
89
Phan tu tu 54 den het sortedSet la: [54, 56, 89]

4. Các phương thức của SortedSet trong Java

Trong các ví dụ nêu trên đã đưa ra khá đầy đủ các phương thức thông dụng của SortedSet trong Java, nếu bạn cần ôn lại và bổ sung thêm các phương thức một cách đầy đủ hơn trong SortedSet thì bạn có thể xem tại bảng dưới đây:

Phương thức Mô tả
comparator() Trả về một đối tượng comparator được sử dụng để sắp xếp thứ tự các phần tử trong tập hợp đã cho. Cũng trả về null nếu tập hợp đã cho sử dụng thứ tự tự nhiên của phần tử.
first() Lấy ra phần tử đầu tiên có trong SortedSet.
headSet(E toElement) Lấy ra các phần tử từ vị trí đầu tiên đến phần tử nhỏ hơn phần tử toElement.
last() Lấy ra phần tử cuối cùng trong SortedSet.
spliterator() Trả về ánh xạ Key-Value được liên kết với khóa ít nhất trong Map đã cho. Ngoài ra, trả về null nếu Map là trống.
subSet(E fromElement, E toElement) Lấy ra một số phần tử nằm trong khoảng chỉ định từ fromElement đến toElement.
tailSet(E fromElement) Lấy ra các phần tử bắt đầu từ phần tử lớn hơn fromElement đến hết các phần tử trong SortedSet