Percursos
/
Crystal
Crystal
/
Exercícios
/
Lista de Linguagens
Lista de Linguagens

Lista de Linguagens

Exercício de aprendizagem

Introdução

Array é uma estrutura de dados mutável que guarda uma coleção de elementos de um tipo específico. Um array é uma estrutura de dados indexável. O facto de os arrays serem mutáveis significa que, se chamares a um array um método que o modifica, o array é modificado. Ou seja, não é criado um novo array, mas sim modificado o array existente.

Para criar um array, usa a sintaxe literal de representação de arrays ([]) e, dentro dela, indica os elementos do array separados por vírgulas.

[1, 2, 3] # => [1, 2, 3]

Crystal infere o tipo do array a partir dos elementos.

[1, 2, 3].class # => Array(Int32)

Arrays com vários tipos

Apesar de termos dito antes que os arrays são uma coleção de elementos de um tipo específico, podes criar um array com vários tipos usando tipos de união. Isto permite que o array contenha elementos de qualquer um dos tipos especificados no tipo de união. Crystal infere o tipo do array a partir dos elementos.

[1, "2", 3.0] # => [1, "2", 3.0]

[1, "2", 3.0].class # => Array(Int32 | Float64 | String)

Arrays multidimensionais

Um array multidimensional é um array de arrays. Isto significa que cada elemento do array é, ele próprio, um array. Isto pode ser útil quando queres guardar dados em formato de tabela. Para definir um array multidimensional, podes escrever um literal de array de arrays ou usar o construtor Array.new.

[[1, 2], [3, 4]]                    # => [[1, 2], [3, 4]]
numbers = Array(Array(Int32)).new() # => []
numbers << [1, 2]                   # => [[1, 2]]

Acrescentar um elemento a um array

Para acrescentar um elemento a um array, usa o operador << (acrescentar).

[1, 2, 3] << 4 # => [1, 2, 3, 4]

O tipo do elemento que queres acrescentar tem de ser igual ao tipo do array; caso contrário, é lançado um erro.

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

Tamanho de um array

Tal como com String, podes obter o tamanho de um array com o método size.

[1, 2, 3].size # => 3

Arrays vazios

O compilador não consegue inferir o tipo do array quando crias um array vazio. Por isso, tens de especificar o tipo do array. Podes fazê-lo especificando o tipo do array com a palavra-chave of ou usando a sintaxe de inicialização de array, que é Array(T).new.

[] of (Int32 | Float64 | String)    # => []
Array(Int32 | Float64 | String).new # => []

Aceder aos elementos

Tal como com String, podes aceder aos elementos de um array com o operador [] (índice), passando-lhe o índice do elemento a que queres aceder. Se o índice estiver fora dos limites, é lançado um IndexError.

[1, 2, 3][0] # => 1

[1, 2, 3][3] # => Index out of bounds (IndexError)

Também é possível aceder a elementos usando um intervalo.

[1, 2, 3][0..1] # => [1, 2]

Criar um array a partir de um intervalo

Para criar um array a partir de um intervalo, usa o método to_a. Isto pode ser útil quando queres criar um array de números.

(1..3).to_a # => [1, 2, 3]

Criar um array a partir de uma string

Para criar um array a partir de uma string, usa o método split. Isto permite-te dividir uma string num array de strings usando um delimitador.

"1,2,3".split(",") # => ["1", "2", "3"]

Também é possível obter um array de carateres a partir de uma string com o método chars.

"123".chars # => ['1', '2', '3']

Para converter um array de Char ou String num String, podes usar o método join, que recebe um delimitador como argumento.

['1', '2', '3'].join(".") # => "1.2.3"

Eliminar um elemento de um array

Quando queres eliminar um elemento do fim de um array, podes usar o método pop, que recebe um argumento opcional que indica quantos elementos remover do fim do array. O método devolve o elemento que foi removido. Se o array estiver vazio, é lançado um IndexError.

numbers = [1, 2, 3]
numbers.pop # => 3
numbers     # => [1, 2]

empty_numbers = [] of Int32
empty_numbers.pop # => Index out of bounds (IndexError)

Quando queres eliminar um elemento de um índice específico de um array, podes usar o método delete_at, que recebe como argumento o índice do elemento a remover. Se o array estiver vazio, é lançado um 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)

Modificar valores num array

Quando queres modificar um elemento de um índice específico de um array, podes usar o operador []= (atribuição por índice), que recebe como argumentos o índice do elemento a modificar e o novo valor. Se o índice estiver fora dos limites, é lançado um IndexError.

numbers = [1, 2, 3]
numbers[1] = 4
numbers # => [1, 4, 3]

numbers[3] = 5 # => Index out of bounds (IndexError)

Instruções

Neste exercício tens de implementar alguns métodos para manipular um array de linguagens de programação.

1. Define um método que devolva um array de linguagens vazio

Define o método LanguageList.list, que não recebe argumentos e devolve um array vazio do tipo Array(String).

LanguageList.list()
# => []

2. Define um método para adicionar uma linguagem ao array

Define o método LanguageList.add, que recebe 2 argumentos (um array de linguagens e um literal de string de uma linguagem). O método deve devolver o array com a nova linguagem adicionada ao fim do array.

language_list = LanguageList.list()
# => []
language_list = LanguageList.add(language_list, "Crystal")
# => ["Crystal"]
language_list = LanguageList.add(language_list, "Ruby")
# => ["Crystal", "Ruby"]

3. Define um método para remover uma linguagem do array

Define o método LanguageList.remove, que recebe 1 argumento (um array de linguagens). O método deve devolver o array sem o último elemento. Assume que o array terá sempre pelo menos um 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"]

4. Define um método que devolva o enésimo elemento do array

Define a função LanguageList.at, que recebe 2 argumentos (um array de linguagens e um índice). O método deve devolver a linguagem no índice n do array. Assume que haverá sempre uma linguagem no índice.

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"

5. Define um método para analisar uma string de linguagens

Define o método LanguageList.parse, que recebe 1 argumento (um literal de string de linguagens separadas por vírgulas). O método deve devolver um array de linguagens.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Editar via GitHub A ligação abre numa nova janela ou separador
Crystal Exercism

Estás pronto para começar Lista de Linguagens?

Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.