Szybkie zestawy: jak z niego korzystać i dlaczego? (Z przykładami)

W tym samouczku nauczysz się o zestawach, tworzeniu zestawów, ich modyfikowaniu i niektórych typowych operacjach na zbiorach.

W poprzednim artykule Swift Arrays dowiedzieliśmy się o tworzeniu tablicy, która może przechowywać wiele wartości na uporządkowanej liście.

Ale jeśli musimy upewnić się, że lista może zawierać wartość tylko raz, używamy zestawu w języku Swift.

Co to jest zestaw?

Zestawy to po prostu kontener, który może przechowywać wiele wartości typu danych na nieuporządkowanej liście i zapewnia unikalny element w kontenerze (tj. Każde dane pojawia się tylko raz).

Lista nieuporządkowana oznacza, że ​​nie otrzymasz elementów w tej samej kolejności, w jakiej zdefiniowałeś elementy w zestawie.

Główną zaletą używania zestawów zamiast tablic jest zapewnienie, że element pojawia się tylko raz i kiedy kolejność elementów nie jest ważna.

Wartości przechowywane w zestawie muszą być hashowane . Oznacza to, że musi udostępniać właściwość hashValue. Jest to ważne, ponieważ zestawy są nieuporządkowane i używa hashValue, aby uzyskać dostęp do elementów zestawów.

Wszystkich podstawowych typów Swifta (takich jak String, Int, Double, i Bool) są hashable domyślnie i mogą być wykorzystane jako typy wartości. Możesz jednak również stworzyć swój Hashable Type w Swift, który można przechowywać w zestawie.

Jak zadeklarować zestaw w Swift?

Możesz utworzyć pusty zestaw, określając typ jako Zestaw, a następnie typ danych, w których może on przechowywać.

Przykład 1: Deklarowanie pustego zestawu

 let emptyIntSet:Set = () print(emptyIntSet) 

LUB

 let emptyIntSet:Set = Set() print(emptyIntSet) 

Po uruchomieniu programu wynik będzie następujący:

 ()

W powyższym programie zadeklarowaliśmy stałą emptyIntSet typu, Setktóra może przechowywać wiele wartości całkowitych i jest inicjalizowana wartością 0.

Ponieważ Swift jest językiem wnioskowania o typie, można również utworzyć zestaw bezpośrednio bez określania typu danych, ale należy zainicjować z pewnymi wartościami, aby kompilator mógł wywnioskować jego typ jako:

Przykład 2: Deklarowanie zestawu z pewnymi wartościami

 let someIntSet:Set = (1, 2, 3, 4, 5, 6, 7, 8, 9) print(someIntSet) 

Po uruchomieniu programu wynik będzie następujący:

 (2, 4, 9, 5, 6, 7, 3, 1, 8)

W powyższym programie zadeklarowaliśmy stałą someIntSet, która może przechowywać zestawy typu Integer bez jawnego określania typu. Jednak :Setpodczas definiowania zmiennej musimy pisać , w przeciwnym razie Swift utworzy dla nas tablicę.

Ponadto, jako tablice, zainicjowaliśmy zestaw wartościami 1, 2, 3, 4, 5, 6, 7, 8, 9 używając ()nawiasów.

Jak się dowiedziałeś, kiedy spróbujesz wydrukować wartości w zestawie jako print(someIntSet), otrzymasz wyniki w innej kolejności niż zdefiniowałeś elementy w zestawie, ponieważ przechowuje wartość bez zdefiniowanej kolejności. Dlatego za każdym razem, gdy uzyskujesz dostęp do zamówienia, zmienia się.

Przykład 3: Deklarowanie zestawu ze zduplikowanymi wartościami

 let someStrSet:Set = ("ab","bc","cd","de","ab") print(someStrSet) 

Po uruchomieniu programu wynik będzie następujący:

 („de”, „ab”, „cd”, „bc”)

W powyższym programie zdefiniowaliśmy zduplikowaną wartość ab w zestawie. I. kiedy próbujemy uzyskać dostęp do wartości wewnątrz zestawu za pomocą print(someStrSet), zduplikowana wartość jest automatycznie usuwana z zestawu. Dlatego zestaw gwarantuje unikalne elementy / wartości wewnątrz niego.

Możesz także zadeklarować zestaw z własnym niestandardowym typem Hashable w Swift. Aby dowiedzieć się więcej, odwiedź Swift Hashable.

Jak uzyskać dostęp do elementów zestawu w Swift?

Nie można uzyskać dostępu do elementów zestawu przy użyciu składni indeksu dolnego jako tablic. Dzieje się tak, ponieważ zbiory są nieuporządkowane i nie mają indeksów umożliwiających dostęp do elementów.

Musisz więc uzyskać dostęp do zestawu za pomocą jego metod i właściwości lub używając pętli for-in.

Przykład 4: Dostęp do elementów zestawu

 var someStrSet:Set = ("ab", "bc", "cd", "de") for val in someStrSet ( print(val) ) 

Po uruchomieniu programu wynik będzie następujący:

 de ab cd bc 

W powyższym programie otrzymujemy val w innej kolejności niż elementy zbioru, ponieważ zbiory są nieuporządkowane w przeciwieństwie do tablic.

Możesz również uzyskać dostęp do elementu zestawu bezpośrednio usuwając wartość z zestawu, jak poniżej:

Przykład 5: Dostęp do elementów zestawu za pomocą remove ()

 var someStrSet:Set = ("ab", "bc", "cd", "de") let someVal = someStrSet.remove("cd") print(someVal) print(someStrSet) 

Po uruchomieniu programu wynik będzie następujący:

 Opcjonalne („cd”) („de”, „ab”, „bc”) 

W powyższym programie możesz zobaczyć, że metoda remove zwraca opcjonalny ciąg. Dlatego zaleca się opcjonalną obsługę, jak poniżej. Aby dowiedzieć się więcej o opcjach, odwiedź Swift Optionals.

Przykład 6: Opcjonalna obsługa funkcji remove ()

 var someStrSet:Set = ("ab", "bc", "cd", "de") if let someVal = someStrSet.remove("cd") ( print(someVal) print(someStrSet) ) else ( print("cannot find element to remove") ) 

Po uruchomieniu programu wynik będzie następujący:

 cd („de”, „ab”, „bc”) 

Jak dodać nowy element do zestawu?

Możesz dodać nowy element do zestawu za pomocą insert()metody w języku Swift.

Przykład 7: Dodaj nowy element za pomocą insert ()

 var someStrSet:Set = ("ab", "bc", "cd", "de") someStrSet.insert("ef") print(someStrSet) 

Po uruchomieniu programu wynik będzie następujący:

 ("ab", "de", "cd", "ef", "bc")

In the above program, we used the set's insert() method to add a new element to a set. Since, sets are unordered, the position of the inserted element isn't known.

Set Operations

Another main advantage of using Sets is you can perform set operations such as combining two sets together, determining which values two sets have in common etc. This operations are similar to the Set operation in Mathematics.

1. Union

The union of two sets a and b is the set of elements which are in a, or b, or in both a and b.

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 2, 4, 6, 8) print(a.union(b)) 

When you run the above program, the output will be:

 (8, 2, 9, 4, 5, 7, 6, 3, 1, 0)

2. Intersection

The intersection of two sets a and b is the set that contains all elements of a that also belong to b.

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 3, 7, 6, 8) print(a.intersection(b)) 

When you run the above program, the output will be:

 (7, 3)

Therefore, print(a.intersection(b)) outputs a new set with values (7, 3) that are common in both a and b.

3. Subtracting

The subtraction of two sets a and b is the set that contains all elements of a but removing the elements that also belong to b.

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 3, 7, 6, 8) print(a.subtracting(b)) 

When you run the above program, the output will be:

 (5, 9, 1)

Therefore, print(a.subtracting(b)) outputs a new set with values (5, 9, 1).

4. Symmetric Difference

The symmetric difference of two sets a and b is the set that contains all elements which are in either of the sets but not in both of them.

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 3, 7, 6, 8) print(a.symmetricDifference(b)) 

When you run the above program, the output will be:

 (5, 6, 8, 0, 1, 9)

Therefore, print(a.symmetricDifference(b)) outputs a new set with values (5, 6, 8, 0, 1, 9).

Set Membership and Equality Operations

Set Equality

You can use == operator to check whether two sets contains same elements or not. It returns true if two sets contains same elements otherwise returns false.

Example 5: Set equality operations

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 3, 7, 6, 8) let c:Set = (9, 7, 3, 1, 5) if a == b ( print("a and b are same") ) else ( print("a and b are different") ) if a == c ( print("a and c are same") ) else ( print("a and c are different") ) 

When you run the above program, the output will be:

 a and b are different a and c are same

Set membership

You can also check relationship between two sets using the following methods:

  • isSubset(of:)This method determines whether all of the values of a set are contained in the specified set.
  • isSuperset(of:) This method determines whether a set contains all of the values in a specified set
  • isStrictSubset(of:) or isStrictSuperset(of:): This method determines whether a set is a subset or superset, but not equal to, a specified set.
  • isDisjoint(with:) This method determines whether two sets have no values in common.

Example 6: Set membership operations

 let a: Set = (1, 3, 5, 7, 9) let b: Set = (0, 3, 1, 7, 6, 8, 9, 5) print("isSubset:", a.isSubset(of: b)) print("isSuperset:", b.isSuperset(of: a)) print("isStrictSubset:", a.isStrictSubset(of: b)) print("isDisjointWith:", a.isDisjoint(with: b)) 

When you run the above program,the output will be:

 isSubset: true isSuperset: true isStrictSubset: true isDisjointWith: false 

Let's analyze methods used inside the print statement below:

  • isSubsetreturns true because the set b contains all the elements in a
  • isSupersetreturn true because b contains all of the values of a.
  • isStrictSubsetreturns true because set b contains all the element in a and both sets are not equal.
  • isDisjointWithreturns false because a and b have some values in common.

Some helpful built in Set functions & properties

1. isEmpty

This property determines if a set is empty or not. It returns true if a set does not contain any value otherwise returns false.

Example 7: How isEmpty works?

 let intSet:Set = (21, 34, 54, 12) print(intSet.isEmpty) 

When you run the program, the output will be:

 false

2. first

This property is used to access first element of a set.

Example 8: How first works?

 let intSet = (21, 34, 54, 12) print(intSet.first) 

When you run the program, the output will be:

 Optional(54)

Since set is an unordered collection, the first property does not guarantee the first element of the set. You may get other value than 54.

Similarly, you can use last property to access last element of a set.

3. insert

The insert function is used to insert/append element in the set.

Example 9: How insert works?

 var intSet:Set = (21, 34, 54, 12) intSet.insert(50) print(intSet) 

When you run the program, the output will be:

 (54, 12, 50, 21, 34)

4. reversed

This function returns the elements of a set in reverse order.

Example 10: How reversed() works?

 var intSet:Set = (21, 22, 23, 24, 25) print(intSet) let reversedSet = intSet.reversed() print(reversedSet) 

When you run the program, the output will be:

 (22, 23, 21, 24, 25) (25, 24, 21, 23, 22) 

5. count

This property returns the total number of elements in a set.

Example 11: How count works?

 let floatSet:Set = (10.2, 21.3, 32.0, 41.3) print(floatSet.count) 

When you run the program, the output will be:

 4

6. removeFirst

This function removes and returns the first value from the set.

Example 12: How removeFirst works?

 var strSet:Set = ("ab", "bc", "cd", "de") let removedVal = strSet.removeFirst() print("removed value is (removedVal)") print(strSet) 

When you run the program, the output will be:

 removed value is de ("ab", "cd", "bc") 

Podobnie możesz użyć removeAllfunkcji do opróżnienia zestawu.

Interesujące artykuły...