Array es una estructura de datos mutable que almacena una colección de elementos de un tipo específico. Un array es una estructura de datos indexable. Que los arrays sean mutables significa que, si se llama a un método sobre un array que modifica el array, el array se modifica. Es decir, no crea un array nuevo, sino que modifica el que ya existe.
Para crear un array, usa la sintaxis de literal de array ([]) y, dentro de ella, especifica los elementos del array separados por comas.
[1, 2, 3] # => [1, 2, 3]
Crystal inferirá el tipo del array a partir de los elementos.
[1, 2, 3].class # => Array(Int32)
Aunque antes se mencionó que los arrays son una colección de elementos de un tipo específico, puedes crear un array con varios tipos usando tipos de unión. Esto permite que el array contenga elementos de cualquiera de los tipos especificados en el tipo de unión. Crystal inferirá el tipo del array a partir de los elementos.
[1, "2", 3.0] # => [1, "2", 3.0]
[1, "2", 3.0].class # => Array(Int32 | Float64 | String)
Un array multidimensional es un array de arrays.
Esto significa que cada elemento del array es, a su vez, un array.
Esto puede ser útil cuando quieres almacenar datos en un formato de tabla.
Para definir un array multidimensional, puedes escribir un literal de array de arrays o usar el constructor Array.new.
[[1, 2], [3, 4]] # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2] # => [[1, 2]]
Para agregar un elemento a un array, usa el operador << (append).
[1, 2, 3] << 4 # => [1, 2, 3, 4]
El tipo del elemento que quieres agregar debe ser el mismo que el tipo del array; si no lo es, se lanzará un error.
numbers : Array(Int32 | Float64) = [1, 2, 3]
numbers << 4.0
numbers # => [1, 2, 3, 4.0]
numbers << "5" # => Error: no overload matches 'Array(Int32 | Float64)#<<' with type String
Al igual que con String, puedes obtener el tamaño de un array usando el método size.
[1, 2, 3].size # => 3
El compilador no puede inferir el tipo del array cuando creas un array vacío.
Por lo tanto, necesitas especificar el tipo del array.
Esto se puede hacer especificando el tipo del array con la palabra clave of, o usando la sintaxis del inicializador de array, que es Array(T).new.
[] of (Int32 | Float64 | String) # => []
Array(Int32 | Float64 | String).new # => []
Al igual que con String, puedes acceder a los elementos de un array usando el operador [] (index) y pasándole el índice del elemento al que quieres acceder.
Si el índice está fuera de los límites, se lanzará un IndexError.
[1, 2, 3][0] # => 1
[1, 2, 3][3] # => Index out of bounds (IndexError)
También es posible acceder a los elementos usando un rango.
[1, 2, 3][0..1] # => [1, 2]
Para crear un array a partir de un rango, usa el método to_a.
Esto puede ser útil cuando quieres crear un array de números.
(1..3).to_a # => [1, 2, 3]
Para crear un array a partir de un string, usa el método split.
Esto te permite dividir un string en un array de strings usando un delimitador.
"1,2,3".split(",") # => ["1", "2", "3"]
También es posible obtener un array de caracteres a partir de un string usando el método chars.
"123".chars # => ['1', '2', '3']
Para convertir un array de Char o String en un String, puedes usar el método join, que recibe un delimitador como argumento.
['1', '2', '3'].join(".") # => "1.2.3"
Cuando quieres eliminar un elemento del final de un array, puedes usar el método pop, que recibe un argumento opcional que especifica cuántos elementos eliminar del final del array.
El método devuelve el elemento que se eliminó.
Si el array está vacío, se lanzará un IndexError.
numbers = [1, 2, 3]
numbers.pop # => 3
numbers # => [1, 2]
empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)
Cuando quieres eliminar el elemento de un índice específico de un array, puedes usar el método delete_at, que recibe como argumento el índice del elemento que quieres eliminar.
Si el array está vacío, se lanzará un IndexError.
numbers = [1, 2, 3]
numbers.delete_at(1) # => 2
numbers # => [1, 3]
empty_numbers = [] of Int32
empty_numbers.delete_at(0) # => Index out of bounds (IndexError)
Cuando quieres modificar el elemento de un índice específico de un array, puedes usar el operador []= (index assign), que recibe como argumentos el índice del elemento que quieres modificar y el nuevo valor.
Si el índice está fuera de los límites, se lanzará un IndexError.
numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]
numbers[3] = 5 # => Index out of bounds (IndexError)
En este ejercicio necesitas implementar algunos métodos para manipular un array de lenguajes de programación.
Define el método LanguageList.list que no recibe argumentos y devuelve un array vacío del tipo Array(String).
LanguageList.list()
# => []
Define el método LanguageList.add que recibe 2 argumentos (un array de lenguajes y un literal de string de un lenguaje).
El método debe devolver el array con el nuevo lenguaje agregado al final.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
Define el método LanguageList.remove que recibe 1 argumento (un array de lenguajes).
El método debe devolver el array sin el último elemento.
Asume que el array siempre tendrá al menos un elemento.
language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
language_list = LanguageList.remove(language_list)
# => ["Crystal"]
Define el método LanguageList.at que recibe 2 argumentos (un array de lenguajes y un índice).
El método debe devolver el lenguaje en el índice n del array.
Asume que en el índice siempre habrá un lenguaje.
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]
LanguageList.at(language_list, 1)
# => "Ruby"
Define el método LanguageList.parse que recibe 1 argumento (un literal de string de lenguajes separados por comas).
El método debe devolver un array de lenguajes.
LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.