Trilhas
/
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 armazena uma coleção de elementos de um tipo específico. Um array é uma estrutura de dados indexável. O fato de arrays serem mutáveis significa que, se um método que modifica o array for chamado nele, o array será modificado. Ou seja, ele não cria um novo array, e sim modifica o que já existe.

Para criar um array, use a sintaxe de literal de array ([]) e, dentro dela, especifique os elementos do array separados por vírgula.

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

O 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 arrays são uma coleção de elementos de um tipo específico, você pode criar um array com vários tipos usando tipos de união. Isso permite que o array contenha elementos de qualquer um dos tipos especificados no tipo de união. 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. Isso significa que cada elemento do array é ele próprio um array. Isso pode ser útil quando você quer armazenar dados em formato de tabela. Para definir um array multidimensional, você pode 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]]

Adicionar um elemento a um array

Para adicionar um elemento a um array, use o operador << (append).

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

O tipo do elemento que você quer adicionar precisa ser o mesmo tipo do array. Caso contrário, um erro será lançado.

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

Assim como com String, você pode obter o tamanho de um array usando o método size.

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

Arrays vazios

O compilador não consegue inferir o tipo do array ao criar um array vazio. Por isso, você precisa especificar o tipo do array. Isso pode ser feito informando o tipo do array, usando 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 # => []

Acessar elementos

Assim como com String, você pode acessar elementos de um array usando o operador [] (índice) e passando o índice do elemento que você quer acessar. Se o índice estiver fora dos limites, um IndexError será lançado.

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

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

Também é possível acessar 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, use o método to_a. Isso pode ser útil quando você quer 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, use o método split. Isso permite dividir uma string em um array de strings usando um delimitador.

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

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

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

Para converter um array de Char ou String em uma String, você pode usar o método join, que recebe um delimitador como argumento.

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

Remover um elemento de um array

Quando você quer remover um elemento do fim de um array, pode usar o método pop, que recebe um argumento opcional indicando quantos elementos remover do fim do array. O método retorna o elemento que foi removido. Se o array estiver vazio, um IndexError será lançado.

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

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

Quando você quer remover um elemento de um índice específico de um array, pode usar o método delete_at, que recebe como argumento o índice do elemento a remover. Se o array estiver vazio, um IndexError será lançado.

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 em um array

Quando você quer modificar um elemento de um índice específico de um array, pode 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, um IndexError será lançado.

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

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

Instruções

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

1. Defina um método para retornar um array de linguagens vazio

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

LanguageList.list()
# => []

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

Defina 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 retornar o array com a nova linguagem adicionada ao final.

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

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

Defina o método LanguageList.remove, que recebe 1 argumento (um array de linguagens). O método deve retornar o array sem o último item. Considere que o array sempre terá pelo menos um item.

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. Defina um método para retornar o enésimo item do array

Defina a função LanguageList.at, que recebe 2 argumentos (um array de linguagens e um índice). O método deve retornar a linguagem no índice n do array. Considere que sempre haverá 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. Defina um método para fazer o parse de uma string de linguagens

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

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar Lista de linguagens?

Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.