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