Set và HashSet trong Java

Set (tập hợp)

Tập hợp Set là cấu trúc dữ liệu, trong đó không có sự lặp lại và không có sự sắp xếp của các phần tử. Giao diện Set không định nghĩa thêm các hàm mới mà chỉ giới hạn lại các hàm của Collection để không cho phép các phần tử của nó được lặp lại.

Giả sử a, b là hai tập hợp (hai đối tượng của các lớp cài đặt Set). Kết quả thực hiện trên a, b có thể mô tả như trong bảng sau:

image

Sau đây chúng ta xét một số lớp thực thi cài đặt giao diện Set.

HashSet

Một dạng cài đặt nguyên thủy của Set là lớp HashSet, trong đó các phần tử của nó là không được sắp. Lớp này có các toán tử tạo lập:

  • HashSet(): Tạo ra một tập mới không có phần tử nào cả (tập rỗng).
  • HashSet(Collection c): Tạo ra một tập mới chứa các phần tử của tập hợp c nhưng không cho phép lặp.
  • HashSet(int initCapacity): Tạo ra một tập mới rỗng có kích thước (khả năng chứa) là initCapacity
  • HashSet(int initCapacity, float loadFactor): Tạo ra một tập mới rỗng có kích thước (khả năng chứa) là initCapacity và yếu tố được nạp vào là loadFactor.

Ví dụ 6.4 Khi thực hiện các đối số được đưa vào sau tên chương trình theo dòng lệnh. Chương trình bắt đầu với tap1 là rỗng và lấy các ký tự của đối số đầu tiên để tạo ra tap2. So sánh hai tập đó, thông báo kết quả ra màn hình, sau đó cộng dồn tap2 vào tap1 và lại tiếp tục như thế đối với đối số tiếp theo cho đến hết.

import java.util.*;
public class TapKT {
  public static void main(String args[]){
    int nArgs = args.length; // Số đối số của chương trình
    Set tap1 = new HashSet(); // Tạo ra tập thứ nhất là rỗng

    for (int i = 0; i < nArgs; i++){
      String arg = args[i]; // Lấy từng đối số của chương trình
      Set tap2 = new HashSet(); // Tạo ra tập thứ 2
      int size = arg.length(); // Số ký tự trong mỗi đối số

      for (int j = 0; j < size; j++) // Tập thứ 2 chứa các ký tự của arg
        tap2.add(new Character(arg.charAt(j)));
      // Tạo ra tập tapChung chính bằng tap1
      Set tapChung = new HashSet(tap1);
      tapChung.retainAll(tap2);// tapChung = tap1 giao tap2
      boolean b = tapChung.size() == 0;
      if (b)
        System.out.println(tap2+" va "+tap1+" la roi nhau");
      else {
      // tap2 có phải là tập con của tap1?
        boolean isSubset = tap1.containsAll(tap2);
        // tap1 có phải là tập con của tap2?
        boolean isSuperset = tap2.containsAll(tap1);
        // tap1 có bằng tap2?
        if (isSuperset && isSubset)
          System.out.println(tap2 + " bang tap " + tap1);
        else if (isSubset)
          System.out.println(tap2+" la tap con cua "+tap1);
        else if (isSuperset)
          System.out.println(tap2+" la tap cha cua "+tap1);
        else
          System.out.println(tap2 + " va " + tap1 + " co " + tapChung + " la phan chung");
      }
      tap1.addAll(tap2);// hợp tap2 vào tap1
    }
  }
}

Dịch và thực hiện chương trình với các đối số như sau:

Kết quả
[m, e] va [ ] la roi nhau
[v, i, o] va [m, e] la roi nhau
[m, e] la tap con cua [m, v, i, e, o]
[a, h, n] va [m, v, i, e, o] la roi nhau
Avatar Administrator

Administrator

@thaycacac
Hãy giữ khuôn mặt bạn luôn hướng về ánh mặt trời, và bóng tối sẽ ngả phía sau bạn.
Logo thể loại Java

Java

Chuyên mục học lập trình
Học Java từ cơ bản đến thông thạo cho mọi đối tượng
hello