English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Conjunto (Set) Swift

Neste tutorial, você aprenderá sobre conjuntos, como criar conjuntos, modificar conjuntos e algumas operações comuns nos conjuntos.

No último artigoArray do SwiftNeste artigo, aprendemos como criar um array que pode conter múltiplos valores em uma lista ordenada.

Mas, se precisarmos garantir que a lista contenha apenas valores únicos, usamos o set (conjunto) no Swift.

O que é um conjunto?

Um conjunto é apenas um contêiner que pode armazenar múltiplos tipos de dados em uma lista não ordenada e garantir que os elementos dentro do contêiner sejam únicos (isto é, cada dado apareça apenas uma vez).

Uma lista não ordenada significa que você não será capaz de obter os elementos na ordem definida para o conjunto.

A principal vantagem de usar conjuntos em vez de arrays é que, quando você precisa garantir que um item apareça apenas uma vez e a ordem dos itens não importa.

Os valores armazenados no conjunto devem ser hasháveis. Isso significa que eles devem fornecer o atributo hashValue. Isso é importante porque os conjuntos são não ordenados e usam hashValue para acessar os elementos do conjunto.

Por padrão, todos os tipos básicos do Swift (como String, Int, Double e Bool) são hasháveis e podem ser usados como tipos de valor de conjunto. No entanto, você também pode criar tipos hasháveis que podem ser armazenados em conjuntos no Swift.

Como declarar conjuntos em Swift?

Pode-se criar um conjunto vazio especificando o tipo como Set e especificando o tipo de dados que pode ser armazenado dentro dele, dentro de <>

Exemplo1:declara um conjunto vazio

let emptyIntSet: Set = []
print(emptyIntSet)

ou

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

Quando você executar o programa, a saída será:

[ ]

No programa acima, declaramos uma constante do tipo Set chamada emptyInt, que pode armazenar múltiplos valores inteiros e inicializar com o valor 0.

Como o Swift é uma linguagem de inferência de tipo, você também pode criar conjuntos de set sem especificar o tipo, mas deve usar alguns valores para inicializar, para que o compilador possa inferir seu tipo:

Exemplo2:declara uma coleção com alguns valores

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

Quando você executar o programa, a saída será:

[2, 4, 9, 5, 6, 7, 3, 1, 8]

No programa acima, declaramos uma constante someIntSet, que pode armazenar uma coleção de Integer sem especificar o tipo explicitamente. No entanto, precisamos usar :Set ao definir a variável, senão o Swift criará um array para nós.

Além disso, como um array, usamos colchetes [] para 1、2、3、4、5、6、7、8、9 Os valores inicializam a coleção.

Você já sabe, quando você tenta usar print(someIntSet) para imprimir os valores da coleção, você obterá uma ordem diferente, diferente da ordem dos itens que você definiu na coleção, porque ele não define a ordem dos valores. Portanto, a ordem de acesso muda sempre que você acessa.

Exemplo3:declara uma coleção com valores repetidos

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

Quando você executar o programa, a saída será:

["de", "ab", "cd", "bc"]

Você já sabe, quando você tenta imprimir os valores da coleção como impressão(someIntSet), no programa acima, definimos um valor repetido 'ab' na coleção. Além disso, quando tentamos acessar os valores da coleção usando print(someStrSet), os valores repetidos serão automaticamente removidos da coleção. Portanto, o set garante que seus elementos sejam únicos/Valores.

Você também pode declarar um conjunto usando seu tipo customizado Hashable no Swift.

Como acessar elementos de conjunto no Swift?

Não pode usar a sintaxe de índice para acessar elementos do conjunto como um array. Isso porque o conjunto é desordenado e não há índice para acessar os elementos.
Portanto, você precisa usar seus métodos e propriedades ou usar for-loop for...in para acessar o conjunto.

Exemplo4: acesso de elementos do conjunto usando for...in

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

Quando você executar o programa, a saída será:

de
ab
cd
bc

No programa acima, o valor obtido é diferente da ordem dos elementos do conjunto, porque o conjunto é desordenado, ao contrário de um array.

Você também pode acessar elementos do conjunto, removendo diretamente valores do conjunto, conforme mostrado a seguir:

Exemplo5: acessar elementos do conjunto usando remove()

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

Quando você executar o programa, a saída será:

Optional("cd")
["de", "ab", "bc"]

No programa acima, você pode ver que o método remove() retorna uma string opcional. Portanto, é recomendável que você execute o seguinte tratamento opcional. Para obter mais informações sobre opcionais, acesseOpcional do Swift.

Exemplo6: tratamento opcional de 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")
}

Quando você executar o programa, a saída será:

cd
["de", "ab", "bc"]

Como adicionar novos elementos ao conjunto?

Você pode usar o método insert() do Swift para adicionar novos elementos ao conjunto.

Exemplo7: adicionar novos elementos usando insert()

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

Quando você executar o programa, a saída será:

["ab", "de", "cd", "ef", "bc"]

No programa acima, usamos o método insert() do conjunto para adicionar novos elementos ao conjunto. Como o conjunto é desordenado, a posição do elemento inserido é desconhecida.

Operações de conjunto

Uma das principais vantagens de usar conjuntos é que você pode executar operações de conjunto, como combinar dois conjuntos e determinar quais valores comuns eles têm. Essas operações são semelhantes às operações de conjuntos na matemática.

1.并集

两个集合a和b的并集是在a或b中 或 在a和b两者中的元素的集合。

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

Quando você executar o programa acima, a saída será:

[8, 2, 9, 4, 5, 7, 6, 3, 1, 0]

2.交集

两个集合a和b的交集是包含a的所有元素的集合,这些元素同时也属于b。

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

Quando você executar o programa acima, a saída será:

[7, 3]

因此,print(a.intersection(b))输出一个新的集合,其值 [7、3] 在 a 和 b 集合中都存在。

3.差集

两个集合a和b的差集,它包含 a 的所有元素,但去掉同样属于 b 的元素。

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

Quando você executar o programa acima, a saída será:

[5, 9, 1]

因此,print(a.subtracting(b)) 输出具有值[ 5,9,1] 的新集合。

4.对称差集

两个集合a和b的对称差是包含所有元素的集合,这些元素位于两个集合中的任何一个中,但不同时存在于两个集合中。

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

Quando você executar o programa acima, a saída será:

[5, 6, 8, 0, 1, 9]

因此,print(a.symmetricDifference(b)) 输出具有值[ 5、6、8、0、1、9] 的新集合。

集合成员关系和相等运算

集合相等

您可以使用 == 运算符检查两个集合是否包含相同的元素。如果两个集合包含相同的元素,则返回true,否则返回false。

Exemplo5:集合相等操作

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和b相同")
} else {
    print("a和b不同")
}
if a == c {
    print("a和c相同")
} else {
    print("a和c不同")
}

Quando você executar o programa acima, a saída será:

a和b不同
a和c相同

集合成员关系

您还可以使用以下方法检查两个集合之间的关系:

  • isSubset(of:) - 此方法确定一个集合的所有值是否都存在于指定的集合中。

  • isSuperset(of:)  - 此方法确定集合是否包含指定集合中的所有值。

  • isStrictSubset(of:) 或 isStrictSuperset(of:): - 此方法确定一个集合是否是指定集合的子集或超集,但不等于指定集合。

  • isDisjoint(with:)  - 此方法确定两个集合是否没有共同的值。

Exemplo6:成员关系操作集合

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

Quando você executar o programa acima, a saída será:

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

Vamos analisar os métodos usados na chamada print abaixo:

  • isSubset retorna true, porque o conjunto b contém todos os elementos do conjunto a

  • isSuperset retorna true, porque b contém todos os valores de a.

  • isStrictSubset retorna true, porque o conjunto b contém todos os elementos do conjunto a e os dois conjuntos não são iguais.

  • isDisjointWith retorna false, porque a e b têm alguns valores comuns.

Funções e propriedades integradas do conjunto

1. isEmpty propriedade

Esta propriedade determina se o conjunto está vazio. Se o conjunto não contiver nenhum valor, ele retorna true, caso contrário, retorna false.

Exemplo7Como funciona a propriedade isEmpty?

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

Quando você executar o programa, a saída será:

false

2.first propriedade

Esta propriedade é usada para acessar o primeiro elemento do conjunto.

Exemplo8Como funciona a propriedade first?

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

Quando você executar o programa, a saída será:

Optional(54)

Como o Set é um conjunto não ordenado, a propriedade first não garante que seja o primeiro elemento do conjunto. Você provavelmente obterá54para outros valores.

Da mesma forma, você pode usar a propriedade last para acessar o último elemento do conjunto.

3.insert() função - Inserir elemento

A função insert() é usada para inserir/Adicionar elemento.

Exemplo9Como funciona a função insert()?

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

Quando você executar o programa, a saída será:

[54, 12, 50, 21, 34]

4.reversed() - Reverter conjunto

Esta função retorna os elementos do conjunto na ordem inversa.

Exemplo10Como funciona o reversed()?

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

Quando você executar o programa, a saída será:

[22, 23, 21, 24, 25]
[25, 24, 21, 23, 22]

5.count - Retorna o número total de elementos no conjunto

Esta propriedade retorna o número total de elementos no conjunto.

Exemplo11Como funciona a contagem de count?

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

Quando você executar o programa, a saída será:

4

6removeFirst - Remover e retornar o primeiro valor do conjunto

Esta função remove e retorna o primeiro valor do conjunto.

Exemplo12Como funciona removeFirst?

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

Quando você executar o programa, a saída será:

removed value is de
["ab", "cd", "bc"]

Da mesma forma, você também pode usar a função removeAll para esvaziar o conjunto.