Loại bỏ các phần tử trùng trong một ArrayList như thế nào?

ArrayList là một trong những Collection được sử dụng nhiều nhất trong java. Nó cung cấp cho sự linh hoạt của việc thêm nhiều phần tử null, phần tử trùng lặp và cũng duy trì thứ tự chèn của các phần tử. Đôi khi, bạn gặp yêu cầu mà bạn phải loại bỏ các phần tử trùng lặp từ ArrayList đã xây dựng xong. Trong bài này, chúng ta sẽ cùng thảo luận các phương pháp để loại bỏ các phần tử trùng lặp từ một ArrayList.

1. Loại bỏ phần tử trùng lặp trong ArrayList sử dụng vòng lặp for

Trong phương pháp này, tôi tạo một ArrayList khác để lưu giữ các phần tử không trùng. Sử dụng một vòng lặp for để duyệt qua các phần tử và sử dụng phương thức contains() của lớp ArrayList để kiểm tra phần tử đã tồn tại trong danh sách mới hay chưa: nếu chưa tồn tại thì thêm nó vào danh sách mới, nếu đã tồn tại thì duyệt qua phần tử kế tiếp. Đến cuối cùng ta có được một danh sách không chứa phần tử trùng.

Ví dụ:

package com.maixuanviet.collection.list.arraylist;
 
import java.util.ArrayList;
import java.util.List;
 
public class RemoveDuplicateInArrayList1 {
    public static void main(String[] args) {
        // Constructing An ArrayList
        List<String> listWithDuplicateElements = new ArrayList<String>();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");
 
        // Printing listWithDuplicateElements
        System.out.println("ArrayList With Duplicate Elements :");
        System.out.println(listWithDuplicateElements);
 
        // Constructing Another ArrayList
        List<String> listWithoutDuplicateElements = new ArrayList<String>();
        for (String element : listWithDuplicateElements) {
            // Check if element not exist in list, perform add element to list
            if (!listWithoutDuplicateElements.contains(element)) {
                listWithoutDuplicateElements.add(element);
            }
        }
 
        // Printing listWithoutDuplicateElements
        System.out.println("\nArrayList After Removing Duplicate Elements :");
        System.out.println(listWithoutDuplicateElements);
    }
}

Kết quả thực thi chương trình trên:

ArrayList With Duplicate Elements :
[JAVA, J2EE, JSP, SERVLETS, JAVA, STRUTS, JSP]
 
ArrayList After Removing Duplicate Elements :
[JAVA, J2EE, JSP, SERVLETS, STRUTS]

2. Loại bỏ phần tử trùng lặp trong ArrayList sử dụng HashSet

Trong phương pháp này, tôi sử dụng HashSet để loại bỏ các phần tử trùng lặp từ một ArrayList. Như bạn đã biết, HashSet không cho phép các phần tử trùng lặp. Tôi sử dụng thuộc tính này của HashSet để loại bỏ các phần tử trùng lặp từ ArrayList đã xây dựng xong. Tuy nhiên, có một bất lợi của phương pháp này. Nghĩa là, nó xóa thứ tự chèn của các phần tử ArrayList. Điều đó có nghĩa là, sau khi gỡ bỏ các phần tử trùng lặp, các phần tử sẽ không còn đúng thứ tự chèn.

Ví dụ:

package com.maixuanviet.collection.list.arraylist;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
public class RemoveDuplicateInArrayList2 {
    public static void main(String[] args) {
        // Constructing An ArrayList
        List<String> listWithDuplicateElements = new ArrayList<String>();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");
 
        // Printing listWithDuplicateElements
        System.out.println("ArrayList With Duplicate Elements :");
        System.out.println(listWithDuplicateElements);
 
        // Constructing HashSet using listWithDuplicateElements
        Set<String> set = new HashSet<String>(listWithDuplicateElements);
 
        // Constructing listWithoutDuplicateElements using set
        List<String> listWithoutDuplicateElements = new ArrayList<String>(set);
 
        // Printing listWithoutDuplicateElements
        System.out.println("\nArrayList After Removing Duplicate Elements :");
        System.out.println(listWithoutDuplicateElements);
    }
}

Kết quả thực thi chương trình trên:

ArrayList With Duplicate Elements :
[JAVA, J2EE, JSP, SERVLETS, JAVA, STRUTS, JSP]
 
ArrayList After Removing Duplicate Elements :
[JAVA, SERVLETS, JSP, J2EE, STRUTS]

Bạn có thể thấy kết quả của ví dụ trên: các phần tử được xáo trộn sau khi loại bỏ các phần tử trùng. Chúng không còn đúng theo thứ tự chèn. Nếu bạn muốn thứ tự chèn của các phần tử được duy trì sau khi loại bỏ các phần tử trùng lặp, thì phương pháp này không được khuyến khích. Có một phương pháp tồn tại mà không làm thay đổi thứ tự chèn của các phần tử ngay cả sau khi loại bỏ các phần tử trùng lặp. Đó là sử dụng LinkedHashSet.

3. Loại bỏ phần tử trùng lặp trong ArrayList sử dụng LinkedHashSet

Trong phương pháp này, tôi sử dụng LinkedHashSet để loại bỏ các phần tử trùng lặp từ ArrayList. Như bạn biết rằng, LinkedHashSet không cho phép các phần tử trùng lặp và duy trì thứ tự chèn của các phần tử. Cả hai thuộc tính này của LinkedHashSet được sử dụng ở đây để loại bỏ các phần tử trùng lặp khỏi ArrayList và cũng duy trì trình tự chèn của các phần tử. Xem ví dụ dưới đây:

package com.maixuanviet.collection.list.arraylist;
 
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
 
public class RemoveDuplicateInArrayList3 {
    public static void main(String[] args) {
        // Constructing An ArrayList
        List<String> listWithDuplicateElements = new ArrayList<String>();
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("J2EE");
        listWithDuplicateElements.add("JSP");
        listWithDuplicateElements.add("SERVLETS");
        listWithDuplicateElements.add("JAVA");
        listWithDuplicateElements.add("STRUTS");
        listWithDuplicateElements.add("JSP");
 
        // Printing listWithDuplicateElements
        System.out.println("ArrayList With Duplicate Elements :");
        System.out.println(listWithDuplicateElements);
 
        // Constructing LinkedHashSet using listWithDuplicateElements
        Set<String> set = new LinkedHashSet<String>(listWithDuplicateElements);
 
        // Constructing listWithoutDuplicateElements using set
        List<String> listWithoutDuplicateElements = new ArrayList<String>(set);
 
        // Printing listWithoutDuplicateElements
        System.out.println("\nArrayList After Removing Duplicate Elements :");
        System.out.println(listWithoutDuplicateElements);
    }
}

Kết quả thực thi chương trình trên:

ArrayList With Duplicate Elements :
[JAVA, J2EE, JSP, SERVLETS, JAVA, STRUTS, JSP]
 
ArrayList After Removing Duplicate Elements :
[JAVA, J2EE, JSP, SERVLETS, STRUTS]

Trên đây là 3 phương pháp thường được sử dụng để loại bỏ các phần tử trùng lặp trong ArrayList. Bạn có thể sử dụng một trong ba phương pháp trên để áp dụng vào chương trình của mình. Trong thực tế, tôi thường sử dụng phương pháp 2 (dùng HashSet) nếu không cần quan tâm đến thứ tự của các phần tử hoặc sử dụng phương pháp 3 (dùng LinkedHashSet) nếu cần giữ đúng thứ tự của phần tử sau khi loại bỏ phần tử trùng.

Trong java 8, chúng ta có thêm một số cách khác để loại bỏ phần tử trùng. Các bạn hãy xem thêm ở bài viết: Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?

1 Trackback / Pingback

  1. Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8? – Blog của VietMX

Comments are closed.