F # - Bộ

Một tập hợp trong F # là một cấu trúc dữ liệu hoạt động như một tập hợp các mục mà không bảo toàn thứ tự các mục được chèn vào. Bộ không cho phép chèn các mục trùng lặp vào bộ sưu tập.

Tạo bộ

Bộ có thể được tạo theo những cách sau:

  • Bằng cách tạo một tập hợp trống bằng Set.empty và thêm các mục bằng chức năng thêm.
  • Chuyển đổi chuỗi và danh sách thành tập hợp.

Chương trình sau đây trình bày các kỹ thuật -

(* creating sets *)
let set1 = Set.empty.Add(3).Add(5).Add(7). Add(9)
printfn"The new set: %A" set1

let weekdays = Set.ofList ["mon"; "tues"; "wed"; "thurs"; "fri"]
printfn "The list set: %A" weekdays

let set2 = Set.ofSeq [ 1 .. 2.. 10 ]
printfn "The sequence set: %A" set2

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

The new set: set [3; 5; 7; 9]
The list set: set ["fri"; "mon"; "thurs"; "tues"; "wed"]
The sequence set: set [1; 3; 5; 7; 9]

Các thao tác cơ bản trên bộ

Bảng sau đây cho thấy các hoạt động cơ bản trên các tập hợp:

Giá trị Sự miêu tả
thêm: 'T → Đặt <' T> → Đặt <'T> Trả về một tập hợp mới với một phần tử được thêm vào tập hợp. Không có ngoại lệ nào được nêu ra nếu tập hợp đã chứa phần tử đã cho.
chứa: 'T → Đặt <' T> → bool Đánh giá để true nếu phần tử đã cho nằm trong tập hợp đã cho.
count: Đặt <'T> → int Trả về số phần tử trong tập hợp.
khác biệt: Đặt <'T> → Đặt <' T> → Đặt <'T> Trả về một tập hợp mới với các phần tử của tập hợp thứ hai bị xóa khỏi tập hợp đầu tiên.
trống: Đặt <'T> Tập hợp trống cho loại được chỉ định.
tồn tại: ('T → bool) → Đặt <' T> → bool Kiểm tra xem có phần tử nào của tập hợp thỏa mãn vị từ đã cho hay không. Nếu hàm đầu vào là vị từ và các phần tử là i0 ... iN, thì hàm này tính vị từ i0 hoặc ... hoặc vị từ iN.
bộ lọc: ('T → bool) → Đặt <' T> → Đặt <'T> Trả về một tập hợp mới chỉ chứa các phần tử của tập hợp mà vị từ đã cho trả về true.
gấp: ('Trạng thái →' T → 'Trạng thái) →' Trạng thái → Đặt <'T> →' Trạng thái Áp dụng hàm tích lũy đã cho cho tất cả các phần tử của tập hợp.
foldBack: ('T →' Trạng thái → 'Trạng thái) → Đặt <' T> → 'Trạng thái →' Trạng thái Áp dụng hàm tích lũy đã cho cho tất cả các phần tử của tập hợp.
forall: ('T → bool) → Đặt <' T> → bool Kiểm tra xem tất cả các phần tử của tập hợp có thỏa mãn vị từ đã cho hay không. Nếu hàm đầu vào là p và các phần tử là i0 ... iN, thì hàm này tính p i0 && ... && p iN.
giao nhau: Đặt <'T> → Đặt <' T> → Đặt <'T> Tính giao của hai tập hợp.
giao nhau Nhiều: seq <Đặt <'T >> → Đặt <' T> Tính toán giao của một dãy các tập hợp. Trình tự không được để trống.
isEmpty: Đặt <'T> → bool Lợi nhuận true nếu tập hợp trống.
isProperSubset: Đặt <'T> → Đặt <' T> → bool Đánh giá để true nếu tất cả các phần tử của tập hợp đầu tiên nằm trong tập hợp thứ hai và ít nhất một phần tử của tập hợp thứ hai không nằm trong tập hợp thứ nhất.
isProperSuperset: Đặt <'T> → Đặt <' T> → bool Đánh giá để true nếu tất cả các phần tử của tập hợp thứ hai nằm trong tập hợp thứ nhất và ít nhất một phần tử của tập hợp thứ nhất không nằm trong tập hợp thứ hai.
isSubset: Đặt <'T> → Đặt <' T> → bool Đánh giá để true nếu tất cả các phần tử của tập thứ nhất nằm trong tập thứ hai.
isSuperset: Đặt <'T> → Đặt <' T> → bool Đánh giá để true nếu tất cả các phần tử của tập thứ hai nằm trong tập thứ nhất.
iter: ('T → đơn vị) → Đặt <' T> → đơn vị Áp dụng hàm đã cho cho từng phần tử của tập hợp, theo thứ tự theo hàm so sánh.
map: ('T →' U) → Đặt <'T> → Đặt <' U> Trả về một tập hợp mới chứa kết quả của việc áp dụng hàm đã cho cho từng phần tử của tập đầu vào.
maxElement: Đặt <'T> →' T Trả về phần tử cao nhất trong tập hợp theo thứ tự đang được sử dụng cho tập hợp.
minElement: Đặt <'T> →' T Trả về phần tử thấp nhất trong tập hợp theo thứ tự đang được sử dụng cho tập hợp.
ofArray: 'T mảng → Đặt <' T> Tạo một tập hợp chứa các phần tử giống như mảng đã cho.
ofList: 'T danh sách → Đặt <' T> Tạo một tập hợp chứa các phần tử giống như danh sách đã cho.
ofSeq: seq <'T> → Đặt <' T> Tạo một bộ sưu tập mới từ đối tượng liệt kê đã cho.
phân vùng: ('T → bool) → Đặt <' T> → Đặt <'T> * Đặt <' T> Tách tập hợp thành hai tập hợp chứa các phần tử mà vị từ đã cho tương ứng trả về true và false.
loại bỏ: 'T → Đặt <' T> → Đặt <'T> Trả về một tập hợp mới với phần tử đã cho đã bị xóa. Không có ngoại lệ nào được nêu ra nếu tập hợp không chứa phần tử đã cho.
singleton: 'T → Đặt <' T> Tập hợp chứa phần tử đã cho.
toArray: Đặt <'T> →' T mảng Tạo một mảng chứa các phần tử của tập hợp theo thứ tự.
toList: Đặt <'T> →' T list Tạo một danh sách có chứa các phần tử của tập hợp theo thứ tự.
toSeq: Đặt <'T> → seq <' T> Trả về dạng xem có thứ tự của tập hợp dưới dạng một đối tượng có thể liệt kê.
union: Đặt <'T> → Đặt <' T> → Đặt <'T> Tính toán hợp nhất của hai tập hợp.
unionMany: seq <Đặt <'T >> → Đặt <' T> Tính toán hợp nhất của một chuỗi các tập hợp.

Ví dụ sau minh họa việc sử dụng một số chức năng trên:

Thí dụ

let a = Set.ofSeq [ 1 ..2.. 20 ]
let b = Set.ofSeq [ 1 ..3 .. 20 ]
let c = Set.intersect a b
let d = Set.union a b
let e = Set.difference a b

printfn "Set a: "
Set.iter (fun x -> printf "%O " x) a
printfn""

printfn "Set b: "
Set.iter (fun x -> printf "%O " x) b
printfn""

printfn "Set c = set intersect of a and b : "
Set.iter (fun x -> printf "%O " x) c
printfn""

printfn "Set d = set union of a and b : "
Set.iter (fun x -> printf "%O " x) d
printfn""

printfn "Set e = set difference of a and b : "
Set.iter (fun x -> printf "%O " x) e
printfn""

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Set a:
1 3 5 7 9 11 13 15 17 19
Set b:
1 4 7 10 13 16 19
Set c = set intersect of a and b :
1 7 13 19
Set d = set union of a and b :
1 3 4 5 7 9 10 11 13 15 16 17 19
Set e = set difference of a and b :
3 5 9 11 15 17