Bộ Java

Xuất bản trong nhóm
Set là một giao diện trong Java Collection Framework. Bạn có thể sử dụng Java Set để triển khai các bộ sưu tập không có thứ tự với các phần tử duy nhất. Trong bài viết này, chúng ta sẽ xem xét giao diện này và các triển khai của nó trong ngôn ngữ Java, các phương pháp để làm việc với một tập hợp và cũng đưa ra một số ví dụ.

Bộ Java là gì

Set là một giao diện từ Java Collection Framework, nhưng Set không phải là một collection có thứ tự, không giống như List . Điều đó có nghĩa là các phần tử của Tập hợp Java được lưu giữ mà không có một thứ tự cụ thể nào. Vì vậy, không có quyền kiểm soát vị trí mà bạn có thể chèn một phần tử. Ngoài ra, bạn không thể truy cập các phần tử theo chỉ mục của chúng. Về mặt toán học, Tập hợp là một tập hợp các phần tử duy nhất. Trên thực tế, đây là một Bộ sưu tập không có thứ tự (Bộ sưu tập không có thứ tự), trong đó các phần tử giống hệt nhau không thể được lưu trữ. Nếu bạn cố tình thêm một phần tử trùng lặp vào Set , hành động này sẽ bị bỏ qua và Set sẽ không thay đổi. Tuy nhiên, được phép lưu trữ một phần tử null trong đó.

Đặt triển khai

Java Set là một giao diện, vì vậy bạn cần sử dụng một trong các triển khai của nó để tạo các đối tượng. Đây là HashSet , TreeSetLinkedHashSet . Trong Set s, mỗi phần tử chỉ được lưu trữ trong một phiên bản và các cách triển khai khác nhau của Set sử dụng một thứ tự khác nhau để lưu trữ các phần tử. Trong một HashSet , thứ tự của các phần tử được xác định bởi một thuật toán phức tạp. Nếu thứ tự lưu trữ quan trọng đối với bạn, hãy sử dụng bộ chứa TreeSet , nơi lưu trữ các đối tượng được sắp xếp theo thứ tự tăng dần theo thứ tự so sánh hoặc LinkedHashSet, lưu trữ các phần tử theo thứ tự bổ sung. Các tập hợp thường được sử dụng để kiểm tra tư cách thành viên để bạn có thể dễ dàng kiểm tra xem một đối tượng có thuộc một tập hợp nhất định hay không, do đó, trong thực tế, việc triển khai HashSet được tối ưu hóa để tra cứu nhanh thường được chọn. HashSet là một bộ sưu tập sử dụng các giá trị băm của chúng được trả về bởi phương thức hashCode() để lưu trữ các phần tử bên trong. Tức là bên trong HashSet<E> , đối tượng HashMap<E, Object> được lưu trữ, lưu trữ các giá trị của HashSet dưới dạng khóa. Sử dụng mã băm cho phép bạn nhanh chóng tìm kiếm, thêm và xóa các phần tử khỏi Tập hợp . LinkedHashSet là một HashSetcũng lưu trữ các phần tử trong một danh sách được liên kết. Một HashSet bình thường không duy trì thứ tự phần tử. Thứ nhất, về mặt chính thức, nó đơn giản là không tồn tại, và thứ hai, ngay cả thứ tự bên trong cũng có thể thay đổi đáng kể khi chỉ một phần tử được thêm vào. Và bạn có thể lấy một trình vòng lặp từ LinkedHashSet và sử dụng nó để duyệt qua tất cả các phần tử theo đúng thứ tự mà chúng được thêm vào LinkedHashSet . Không thường xuyên, nhưng đôi khi nó có thể rất cần thiết. TreeSet là một bộ sưu tập lưu trữ các phần tử dưới dạng cây có thứ tự giá trị. Bên trong TreeSet<E> là một TreeMap<E, Object> lưu trữ tất cả các giá trị này. Và TreeMap nàysử dụng cây nhị phân cân bằng đỏ đen để lưu trữ các phần tử. Do đó, nó có các thao tác add() , remove() , contains() rất nhanh .

Tạo đối tượng tập hợp

Để tạo Đối tượng Tập hợp , bạn có thể sử dụng một trong các biểu mẫu sau:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Đây là một ví dụ đơn giản, trong đó chúng tôi tạo 2 Set s, HashSetLinkedHashSet và thêm vào mỗi phần tử 5 phần tử. Chúng ta có thể sử dụng phương thức add() cho việc này.

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
Đây là đầu ra của chương trình:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Như chúng tôi đã đề cập ở trên, HashSet không duy trì thứ tự của các phần tử, nhưng LinkedHashSet thì có. Chính LinkedHashSet đã cung cấp cho chúng tôi các phần tử theo thứ tự mà chúng tôi đã viết chúng vào tập hợp.

Các phương thức tập hợp Java

Dưới đây là một số phương thức quan trọng của Java Set :
  • boolean thêm(E e) . Thêm phần tử đã chỉ định vào tập hợp nếu nó chưa có (thao tác tùy chọn).

  • boolean loại bỏ (Đối tượng o) . Xóa phần tử đã chỉ định khỏi tập hợp này nếu có (thao tác tùy chọn).

  • boolean removeAll(Bộ sưu tập c) . Xóa khỏi tập hợp này tất cả các phần tử của nó có trong tập hợp đã chỉ định (thao tác tùy chọn).

  • boolean holdAll(Bộ sưu tập c) . Chỉ giữ lại các phần tử trong tập hợp này được chứa trong tập hợp đã chỉ định (thao tác tùy chọn).

  • xóa khoảng trống() . Xóa tất cả các phần tử khỏi tập hợp.

  • Trình lặp iterator() . Trả về một trình vòng lặp trên các phần tử trong tập hợp này.

  • kích thước int() . nó được sử dụng để lấy số phần tử trong Tập hợp.

  • boolean isEmpty() . để kiểm tra xem Set có trống hay không.

  • boolean chứa(Đối tượng o) . Trả về true nếu Tập hợp này chứa phần tử đã chỉ định.

  • Trình lặp iterator() . Trả về một trình vòng lặp trên các phần tử trong tập hợp này. Các phần tử được trả về không theo thứ tự cụ thể.

  • Đối tượng[] toArray() . Trả về một mảng chứa tất cả các phần tử trong tập hợp này. Nếu bộ này đưa ra bất kỳ đảm bảo nào về thứ tự các phần tử của nó được trả về bởi trình vòng lặp của nó, thì phương thức này phải trả về các phần tử theo cùng một thứ tự.

Các phương thức này tương tự như các phương thức của ArrayList , ngoại trừ phương thức add(Object o) chỉ thêm một đối tượng vào tập hợp nếu nó chưa có ở đó. Giá trị trả về của phương thức là true nếu đối tượng đã được thêm vào và false nếu không. Ngoài ra còn có một số phương thức kế thừa từ Collection<> Interface: phương thức parallelStream() , removeIf() , stream()forEach() kế thừa từ java.lang.Iterable Interface.

Java Đặt ví dụ hoạt động chính

Trong ví dụ này, chúng tôi tạo một mảng các chuỗi và sau đó chuyển nó tới mySet bằng thao tác Arrays.asList . Sau đó, chúng tôi loại bỏ thêm một số yếu tố và thêm một số yếu tố khác. Trong trường hợp này, một trong các thành phần trong tập hợp đã tồn tại: nó sẽ không được thêm vào. Chúng tôi cũng sẽ thử các thao tác kiểm tra sự trống rỗng isEmpty() , xác định kích thước của tập hợp size() và xóa tập hợp tất cả các phần tử clear() .

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
Đầu ra của chương trình là đây:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] Số lượng phần tử của tập hợp = 5 MySet có trống không? sai Igor có trong tập hợp không? sai Johnny có ở trong phim trường không? true Bây giờ mySet có trống không? ĐÚNG VẬY

Ví dụ với LinkedHashSet và đặt thành Array

Hãy viết một chương trình khác. Trong đó, chúng tôi sẽ tạo một tập hợp dựa trên LinkedHashSet , thêm các phần tử vào đó, sau đó chuyển đổi tập hợp thành một mảng.

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
Đây là đầu ra của chương trình:
[C, D, E, F, G, A, B] false In tập hợp của chúng ta với các phần tử đã bị xóa: [C, D, E, G, A, B] Mảng mới từ tập hợp: [C, D, E, G, A, B] C

Đặt ví dụ với iterator

Hãy tạo một tập hợp, sau đó in nó ra bằng một trình vòng lặp, sau đó xóa tất cả các số chẵn khỏi nó, cũng bằng một trình vòng lặp.

import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
Đầu ra của chương trình là đây:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Ví dụ với TreeSet

Nếu việc sắp xếp là quan trọng đối với bạn, thì hãy sử dụng triển khai TreeSet . Trong ví dụ ngắn này, chúng tôi sẽ điền vào tập hợp tên của những người bạn, như trong các ví dụ trước. Tuy nhiên, trong một TreeSet được sắp xếp , các phần tử sẽ ngay lập tức được viết theo thứ tự đã sắp xếp. Trong trường hợp này, tên sẽ được hiển thị theo thứ tự bảng chữ cái.

import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
Đầu ra là:
[Alex, Bel, Igor, Johnny, Stuart]

kết luận ngắn gọn

  • Giao diện Java Set là một phần của Java Collections Framework.

  • Các lớp đã triển khai: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • Các triển khai Set phổ biến nhất là HashSet , LinkedHashSetTreeSet .

  • Thứ tự phần tử HashSet được xác định bởi một thuật toán phức tạp. Nếu thứ tự lưu trữ quan trọng đối với bạn, hãy sử dụng vùng chứa TreeSet , nơi lưu trữ các đối tượng được sắp xếp theo thứ tự tăng dần theo thứ tự so sánh hoặc LinkedHashSet , nơi lưu trữ các phần tử theo thứ tự bổ sung.

  • Thông thường, các bộ được sử dụng để kiểm tra tư cách thành viên. Đó là, để kiểm tra xem một đối tượng có thuộc một tập hợp nhất định theo nghĩa toán học hay không. Vì vậy, thông thường nhất trong tất cả các triển khai Set trong thực tế, HashSet thường được chọn. Việc triển khai này được tối ưu hóa để tìm kiếm nhanh.

  • Bạn không thể thêm các phần tử trùng lặp vào một tập hợp, vì vậy, bạn có thể sử dụng các triển khai của giao diện Tập hợp để lưu trữ các phần tử duy nhất.

  • Set cho phép bạn chỉ thêm một phần tử null.

  • Tập hợp không phải là một danh sách và không hỗ trợ chỉ mục hoặc vị trí của các phần tử trong đó.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION