F # - zestawy

Zestaw w F # to struktura danych, która działa jak kolekcja elementów bez zachowania kolejności, w jakiej elementy są wstawiane. Zestawy nie pozwalają na wstawianie zduplikowanych wpisów do kolekcji.

Tworzenie zestawów

Zestawy można tworzyć w następujący sposób -

  • Tworząc pusty zestaw za pomocą Set.empty i dodając elementy za pomocą funkcji add.
  • Przekształcanie sekwencji i list w zestawy.

Poniższy program demonstruje techniki -

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

Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -

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]

Podstawowe operacje na zbiorach

Poniższa tabela przedstawia podstawowe operacje na zestawach -

Wartość Opis
dodaj: 'T → Ustaw <' T> → Ustaw <'T> Zwraca nowy zestaw z elementem dodanym do zestawu. Żaden wyjątek nie jest zgłaszany, jeśli zestaw zawiera już dany element.
zawiera: 'T → Ustaw <' T> → bool Ocenia do true czy dany element należy do danego zbioru.
count: Ustaw <'T> → int Zwraca liczbę elementów w zestawie.
różnica: Ustaw <'T> → Ustaw <' T> → Ustaw <'T> Zwraca nowy zestaw z elementami drugiego zestawu usuniętymi z pierwszego.
pusty: Ustaw <'T> Pusty zestaw dla określonego typu.
istnieje: ('T → bool) → Set <' T> → bool Sprawdza, czy którykolwiek element kolekcji spełnia podany predykat. Jeśli funkcja wejściowa jest predykatem, a elementy są i0 ... iN, to ta funkcja oblicza predykat i0 lub ... lub predykat iN.
filtr: ('T → bool) → Ustaw <' T> → Ustaw <'T> Zwraca nową kolekcję zawierającą tylko elementy kolekcji, dla których zwraca dany predykat true.
fold: ('Stan →' T → 'Stan) →' Stan → Ustaw <'T> →' Stan Stosuje daną funkcję sumującą do wszystkich elementów zbioru.
foldBack: ('T →' Stan → 'Stan) → Ustaw <' T> → 'Stan →' Stan Stosuje daną funkcję sumującą do wszystkich elementów zbioru.
forall: ('T → bool) → Set <' T> → bool Sprawdza, czy wszystkie elementy kolekcji spełniają podany predykat. Jeśli funkcją wejściową jest p, a elementy to i0 ... iN, to ta funkcja oblicza p i0 && ... && p iN.
przecięcie: Ustaw <'T> → Ustaw <' T> → Ustaw <'T> Oblicza przecięcie dwóch zbiorów.
intersectMany: seq <Ustaw <'T >> → Ustaw <' T> Oblicza przecięcie sekwencji zbiorów. Sekwencja nie może być pusta.
isEmpty: Set <'T> → bool Zwroty true jeśli zestaw jest pusty.
isProperSubset: Set <'T> → Set <' T> → bool Ocenia do true jeśli wszystkie elementy pierwszego zestawu są w drugim, a co najmniej jeden element drugiego nie znajduje się w pierwszym.
isProperSuperset: Set <'T> → Set <' T> → bool Ocenia do true jeśli wszystkie elementy z drugiego zestawu są w pierwszym, a przynajmniej jeden element z pierwszego nie znajduje się w drugim.
isSubset: Set <'T> → Set <' T> → bool Ocenia do true jeśli wszystkie elementy pierwszego zestawu znajdują się w drugim.
isSuperset: Set <'T> → Set <' T> → bool Ocenia do true jeśli wszystkie elementy drugiego zestawu znajdują się w pierwszym.
iter: ('T → jednostka) → Ustaw <' T> → jednostka Stosuje daną funkcję do każdego elementu zestawu, zgodnie z funkcją porównania.
map: ('T →' U) → Ustaw <'T> → Ustaw <' U> Zwraca nową kolekcję zawierającą wyniki zastosowania danej funkcji do każdego elementu zestawu wejściowego.
maxElement: Ustaw <'T> →' T Zwraca najwyższy element w zestawie zgodnie z kolejnością używaną w zestawie.
minElement: Ustaw <'T> →' T Zwraca najniższy element w zestawie zgodnie z kolejnością używaną dla zestawu.
ofArray: 'Tablica T → Ustaw <' T> Tworzy zestaw zawierający te same elementy, co dana tablica.
ofList: 'T lista → Ustaw <' T> Tworzy zestaw zawierający te same elementy, co podana lista.
ofSeq: seq <'T> → Set <' T> Tworzy nową kolekcję z danego wyliczalnego obiektu.
partycja: ('T → bool) → Ustaw <' T> → Ustaw <'T> * Ustaw <' T> Dzieli zestaw na dwa zbiory zawierające elementy, dla których dany predykat zwraca odpowiednio prawdę i fałsz.
usuń: 'T → Ustaw <' T> → Ustaw <'T> Zwraca nowy zestaw z usuniętym danym elementem. Żaden wyjątek nie jest zgłaszany, jeśli zestaw nie zawiera danego elementu.
singleton: 'T → Ustaw <' T> Zestaw zawierający dany element.
toArray: Ustaw tablicę <'T> →' T. Tworzy tablicę zawierającą elementy zestawu w kolejności.
toList: Ustaw <'T> →' T list Tworzy listę zawierającą elementy zestawu w kolejności.
toSeq: Ustaw <'T> → seq <' T> Zwraca uporządkowany widok kolekcji jako wyliczalny obiekt.
suma: Ustaw <'T> → Ustaw <' T> → Ustaw <'T> Oblicza sumę dwóch zbiorów.
unionMany: seq <Ustaw <'T >> → Ustaw <' T> Oblicza sumę sekwencji zbiorów.

Poniższy przykład demonstruje zastosowania niektórych z powyższych funkcji -

Przykład

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

Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -

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