F# - 集合



F# 中的集合是一種資料結構,充當專案的集合,但不保留插入專案的順序。集合不允許將重複項插入集合。

建立集合

集合可以透過以下方式建立:

  • 使用 Set.empty 建立一個空集,並使用 add 函式新增項。
  • 將序列和列表轉換為集合。

以下程式演示了這些技術:

(* 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

編譯並執行程式時,會產生以下輸出:

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]

集合的基本操作

下表顯示了集合的基本操作:

描述
add : 'T → Set<'T> → Set<'T> 返回一個新的集合,其中包含新增到該集合的元素。如果集合已包含給定元素,則不會引發異常。
contains : 'T → Set<'T> → bool 如果給定元素在給定集合中,則計算結果為true
count : Set<'T> → int 返回集合中元素的數量。
difference : Set<'T> → Set<'T> → Set<'T> 返回一個新的集合,其中從第一個集合中刪除了第二個集合的元素。
empty : Set<'T> 指定型別的空集。
exists : ('T → bool) → Set<'T> → bool 測試集合中的任何元素是否滿足給定的謂詞。如果輸入函式是謂詞,而元素是 i0...iN,則此函式計算謂詞 i0 或 ... 或謂詞 iN。
filter : ('T → bool) → Set<'T> → Set<'T> 返回一個新集合,其中僅包含給定謂詞返回true的集合的元素。
fold : ('State → 'T → 'State) → 'State → Set<'T> → 'State 將給定的累積函式應用於集合的所有元素。
foldBack : ('T → 'State → 'State) → Set<'T> → 'State → 'State 將給定的累積函式應用於集合的所有元素。
forall : ('T → bool) → Set<'T> → bool 測試集合中的所有元素是否滿足給定的謂詞。如果輸入函式是 p,而元素是 i0...iN,則此函式計算 p i0 && ... && p iN。
intersect : Set<'T> → Set<'T> → Set<'T> 計算兩個集合的交集。
intersectMany : seq<Set<'T>> → Set<'T> 計算一系列集合的交集。該序列必須是非空的。
isEmpty : Set<'T> → bool 如果集合為空,則返回true
isProperSubset : Set<'T> → Set<'T> → bool 如果第一個集合的所有元素都在第二個集合中,並且第二個集合中至少有一個元素不在第一個集合中,則計算結果為true
isProperSuperset : Set<'T> → Set<'T> → bool 如果第二個集合的所有元素都在第一個集合中,並且第一個集合中至少有一個元素不在第二個集合中,則計算結果為true
isSubset : Set<'T> → Set<'T> → bool 如果第一個集合的所有元素都在第二個集合中,則計算結果為true
isSuperset : Set<'T> → Set<'T> → bool 如果第二個集合的所有元素都在第一個集合中,則計算結果為true
iter : ('T → unit) → Set<'T> → unit 將給定的函式應用於集合的每個元素,按照比較函式的順序。
map : ('T → 'U) → Set<'T> → Set<'U> 返回一個新集合,其中包含將給定函式應用於輸入集合的每個元素的結果。
maxElement : Set<'T> → 'T 根據用於集合的排序返回集合中最高的元素。
minElement : Set<'T> → 'T 根據用於集合的排序返回集合中最低的元素。
ofArray : 'T array → Set<'T> 建立一個包含與給定陣列相同元素的集合。
ofList : 'T list → Set<'T> 建立一個包含與給定列表相同元素的集合。
ofSeq : seq<'T> → Set<'T> 從給定的可列舉物件建立一個新集合。
partition : ('T → bool) → Set<'T> → Set<'T> * Set<'T> 將集合拆分為兩個集合,分別包含給定謂詞返回 true 和 false 的元素。
remove : 'T → Set<'T> → Set<'T> 返回一個新的集合,其中已刪除給定元素。如果集合不包含給定元素,則不會引發異常。
singleton : 'T → Set<'T> 包含給定元素的集合。
toArray : Set<'T> → 'T array 建立一個包含集合中元素(按順序)的陣列。
toList : Set<'T> → 'T list 建立一個包含集合中元素(按順序)的列表。
toSeq : Set<'T> → seq<'T> 以可列舉物件的形式返回集合的有序檢視。
union : Set<'T> → Set<'T> → Set<'T> 計算兩個集合的並集。
unionMany : seq<Set<'T>> → Set<'T> 計算一系列集合的並集。

以下示例演示了上述某些功能的使用:

示例

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""

編譯並執行程式時,會產生以下輸出:

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
廣告

© . All rights reserved.