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

Conjuntos (Set) en Swift

En este tutorial, aprenderá sobre los conjuntos, cómo crearlos, modificarlos y algunas operaciones comunes en los conjuntos.

En el artículo anteriorArray de SwiftEn este artículo, hemos aprendido cómo crear un array que pueda contener múltiples valores en una lista ordenada.

Pero, si queremos asegurarnos de que una lista solo tenga valores únicos, entonces usamos set (conjunto) en Swift.

¿Qué es un conjunto?

Un conjunto es solo un contenedor que puede almacenar varios tipos de valores en una lista desordenada y asegurar que los elementos dentro del contenedor sean únicos (es decir, cada dato solo aparece una vez).

Una lista desordenada significa que no podrá obtener los elementos en el orden definido para los elementos del conjunto.

La principal ventaja de usar un conjunto en lugar de un array es que, cuando necesite asegurarse de que un elemento solo aparezca una vez y la secuencia de los elementos no sea importante.

Los valores almacenados en el conjunto deben ser hashables. Esto significa que deben proporcionar el atributo hashValue. Esto es importante porque los conjuntos son unordered y utilizan hashValue para acceder a los elementos del conjunto

Por defecto, todos los tipos básicos de Swift (como String, Int, Double y Bool) son hashables y se pueden usar como tipos de valores para conjuntos. Pero también puedes crear tipos hashables que se pueden almacenar en conjuntos en Swift

¿Cómo declarar un conjunto en Swift?

Puedes crear un conjunto vacío especificando el tipo como set y luego especificando el tipo de datos que puede almacenar entre <>

Ejemplo1:Declarar un conjunto vacío

let emptyIntSet:Set = []
print(emptyIntSet)

o

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

Al ejecutar el programa, la salida es:

[ ]

En el programa anterior, declaramos una constante de tipo Set llamada emptyInt, que puede almacenar múltiples valores enteros e inicializarlos con el valor 0

Dado que Swift es un lenguaje de inferencia de tipos, también puedes crear conjuntos sin especificar el tipo de datos, pero debes usar algunos valores para inicializarlos, de modo que el compilador pueda inferir su tipo:

Ejemplo2:Declarar un conjunto con ciertos valores

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

Al ejecutar el programa, la salida es:

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

En el programa anterior, declaramos una constante someIntSet que puede almacenar un conjunto de Integer sin especificar explícitamente el tipo. Sin embargo, necesitamos incluir :Set al definir la variable, de lo contrario Swift nos creará un array

Además, como un array, usamos corchetes [] para 1、2、3、4、5、6、7、8、9 Los valores inicializan el conjunto

Ya sabes, cuando intentas usar print(someIntSet) para imprimir los valores del conjunto, obtienes un orden diferente, diferente al orden de los elementos que ya has definido en el conjunto, porque no define el orden de almacenamiento de los valores. Por lo tanto, el orden de acceso cambia cada vez

Ejemplo3:Declarar un conjunto con valores repetidos

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

Al ejecutar el programa, la salida es:

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

Ya sabes, cuando intentas imprimir los valores de un conjunto como impresión(someIntSet), en el programa anterior, definimos un valor repetido ab en el conjunto. Además. Cuando intentamos acceder a los valores del conjunto utilizando print(someStrSet), los valores repetidos se eliminan automáticamente del conjunto. Por lo tanto, set garantiza que sus elementos sean únicos/Valores.

También puede declarar un conjunto utilizando su tipo personalizado Hashable en Swift.

¿Cómo acceder a elementos de conjunto en Swift?

No se puede usar la sintaxis de índice para acceder a los elementos del conjunto como en un array. Esto se debe a que los conjuntos son desordenados y no tienen índices de acceso.
Por lo tanto, debe usar sus métodos y propiedades o usar for-El bucle in se utiliza para acceder a los elementos del conjunto.

Ejemplo4: acceso a elementos del conjunto con for...in

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

Al ejecutar el programa, la salida es:

de
ab
cd
bc

En el programa anterior, el valor obtenido es diferente en orden de los elementos del conjunto, porque los conjuntos son desordenados, a diferencia de los arrays.

También puede acceder a elementos del conjunto, eliminando directamente valores del conjunto, como se muestra a continuación:

Ejemplo5: acceder a elementos del conjunto usando remove()

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

Al ejecutar el programa, la salida es:

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

En el programa anterior, puede ver que el método remove devuelve un valor opcional de cadena. Por lo tanto, se recomienda que realice el siguiente manejo opcional. Para obtener más información sobre los valores opcionales, visiteSwift opcional.

Ejemplo6: manejo opcional de remove()

var someStrSet:Set = ["ab", "bc", "cd", "de"]
if let someVal = someStrSet.remove("cd") {
    print(someVal)
    print(someStrSet)
} else {
    print("no se puede encontrar el elemento para eliminar")
}

Al ejecutar el programa, la salida es:

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

¿Cómo agregar nuevos elementos a un conjunto?

Puede usar el método insert() de Swift para agregar nuevos elementos a un conjunto.

Ejemplo7: agregar nuevos elementos usando insert()

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

Al ejecutar el programa, la salida es:

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

En el programa anterior, utilizamos el método insert() del conjunto para agregar nuevos elementos al conjunto. Dado que los conjuntos son desordenados, la posición de inserción de los elementos es desconocida.

Operaciones de conjuntos

Una de las principales ventajas de usar conjuntos es que se pueden realizar operaciones de conjuntos, como combinar dos conjuntos, determinar qué valores tienen en común dos conjuntos, etc. Estas operaciones son similares a las operaciones de conjuntos en matemáticas.

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

Al ejecutar el programa anterior, la salida 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))

Al ejecutar el programa anterior, la salida 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))

Al ejecutar el programa anterior, la salida 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))

Al ejecutar el programa anterior, la salida será:

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

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

集合成员关系和相等运算

集合相等

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

Ejemplo5:集合相等操作

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不同")
}

Al ejecutar el programa anterior, la salida será:

a和b不同
a和c相同

集合成员关系

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

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

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

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

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

Ejemplo6:集合成员关系操作

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

Al ejecutar el programa anterior, la salida será:

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

Vamos a analizar los métodos utilizados en la declaración print a continuación:

  • isSubset devuelve true, porque el conjunto b contiene todos los elementos del conjunto a

  • isSuperset devuelve true, porque b contiene todos los valores de a.

  • isStrictSubset devuelve true, porque el conjunto b contiene todos los elementos del conjunto a y los conjuntos no son iguales.

  • isDisjointWith devuelve false, porque a y b tienen algunos valores comunes.

Funciones y propiedades integradas del conjunto

1. isEmpty propiedad

Esta propiedad determina si el conjunto está vacío. Si el conjunto no contiene ningún valor, devuelve true, de lo contrario devuelve false.

Ejemplo7¿Cómo funciona isEmpty?

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

Al ejecutar el programa, la salida es:

false

2.first propiedad

Esta propiedad se utiliza para acceder al primer elemento del conjunto.

Ejemplo8¿Cómo funciona first?

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

Al ejecutar el programa, la salida es:

Optional(54)

Dado que Set es un conjunto no ordenado, la propiedad first no garantiza que sea el primer elemento del conjunto. Es probable que obtenga54y otros valores.

Asimismo, puede usar la propiedad last para acceder al último elemento del conjunto.

3.insert() función - Insertar elementos

La función insert() se utiliza para insertar/Añadir elementos.

Ejemplo9¿Cómo funciona la función insert()?

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

Al ejecutar el programa, la salida es:

[54, 12, 50, 21, 34]

4.reversed() - Invertir el conjunto

Esta función devuelve los elementos del conjunto en orden inverso.

Ejemplo10¿Cómo funciona reversed()?

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

Al ejecutar el programa, la salida es:

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

5.count - Devuelve el número total de elementos en la colección

Esta propiedad devuelve el número total de elementos en la colección.

Ejemplo11:¿Cómo funciona count (contador)?

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

Al ejecutar el programa, la salida es:

4

6. removeFirst - Eliminar y devolver el primer valor de la colección

Esta función elimina y devuelve el primer valor de la colección.

Ejemplo12:¿Cómo funciona removeFirst?

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

Al ejecutar el programa, la salida es:

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

Del mismo modo, también puede usar la función removeAll para vaciar la colección.