Me confunden tanto las matrices 2D en Swift. Déjame describirte paso a paso. ¿Y podría corregirme si me equivoco?
Ante todo; declaración de una matriz vacía:
class test{
var my2Darr = Int[][]()
}
En segundo lugar llene la matriz. (como my2Darr[i][j] = 0
donde i, j son variables de ciclo for)
class test {
var my2Darr = Int[][]()
init() {
for(var i:Int=0;i<10;i++) {
for(var j:Int=0;j<10;j++) {
my2Darr[i][j]=18 /* Is this correct? */
}
}
}
}
Y por último, elemento de edición de una matriz
class test {
var my2Darr = Int[][]()
init() {
.... //same as up code
}
func edit(number:Int,index:Int){
my2Darr[index][index] = number
// Is this correct? and What if index is bigger
// than i or j... Can we control that like
if (my2Darr[i][j] == nil) { ... } */
}
}
var my2DArray = Array(count: 10, repeatedValue: Array(count: 10, repeatedValue: 18))
Y realmente deberías actualizar a una versión beta más nueva.Int[][]()
ya no es una sintaxis válida. Se ha cambiado a[[Int]]()
.Respuestas:
Definir matriz mutable
O:
O si necesita una matriz de tamaño predefinido (como lo menciona @ 0x7fffffff en los comentarios):
Cambiar elemento en la posición
O
Cambiar submatriz
O
O
Si tenía una matriz 3x2 de 0 (ceros) antes de estos cambios, ahora tiene:
Así que tenga en cuenta que las submatrices son mutables y puede redefinir la matriz inicial que representa la matriz.
Examinar tamaño / límites antes del acceso
Observaciones: las mismas reglas de marcado para matrices de 3 y N dimensiones.
fuente
arr
definido como en la respuesta, entoncesmyVar
debería ser Int, ¿verdad?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
De los documentos:
Puede crear matrices multidimensionales anidando pares de corchetes, donde el nombre del tipo base de los elementos está contenido en el par más interno de corchetes. Por ejemplo, puede crear una matriz tridimensional de números enteros utilizando tres conjuntos de corchetes:
Al acceder a los elementos en una matriz multidimensional, el índice de subíndice más a la izquierda se refiere al elemento en ese índice en la matriz más externa. El siguiente índice de subíndice a la derecha se refiere al elemento en ese índice en la matriz que está anidado en un nivel. Y así sucesivamente. Esto significa que en el ejemplo anterior, array3D [0] se refiere a [[1, 2], [3, 4]], array3D [0] [1] se refiere a [3, 4] y array3D [0] [1 ] [1] se refiere al valor 4.
fuente
Hazlo Genérico Swift 4
fuente
Debe tener cuidado al usar
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Si el valor es un objeto, que está inicializado por
MyClass()
, utilizarán la misma referencia.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
no crea una nueva instancia deMyClass
en cada elemento de la matriz. Este método solo creaMyClass
una vez y lo coloca en la matriz.Esta es una forma segura de inicializar una matriz multidimensional.
fuente
Array(repeating: {value}, could 80)
con llaves{value}
? Eso crearía una serie de cierres, ¿no es así?{value}
una metanotación para "algún valor de tipo AnyObject" (un tipo de referencia)?En Swift 4
fuente
De acuerdo con los documentos de Apple para swift 4.1, puede usar esta estructura tan fácilmente para crear una matriz 2D:
Enlace: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Muestra de código:
fuente
Array(repeating:count:)
. Vea el comentario que publiqué en su otra respuesta.Antes de utilizar matrices multidimensionales en Swift, considere su impacto en el rendimiento . En mis pruebas, la matriz aplanada funcionó casi 2 veces mejor que la versión 2D:
Tiempo medio de ejecución para llenar una matriz de 50x50: 82,9 ms
vs.
Tiempo medio de ejecución para llenar una matriz 2D de 50x50: 135 ms
Ambos algoritmos son O (n ^ 2), por lo que la diferencia en los tiempos de ejecución se debe a la forma en que inicializamos la tabla.
Finalmente, lo peor que puede hacer es usar
append()
para agregar nuevos elementos. Eso resultó ser el más lento en mis pruebas:Tiempo de ejecución promedio para llenar una matriz de 50x50 usando append (): 2.59s
Conclusión
Evite las matrices multidimensionales y utilice el acceso por índice si la velocidad de ejecución es importante. Las matrices 1D son más eficaces, pero su código puede ser un poco más difícil de entender.
Puede ejecutar las pruebas de rendimiento usted mismo después de descargar el proyecto de demostración desde mi repositorio de GitHub: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
fuente
Esto se puede hacer en una sola línea.
Rápido 5
También puede asignarlo a instancias de cualquier clase o estructura de su elección
fuente