Track
/
Crystal
Crystal
/
Esercizi
/
Elenco di linguaggi
Elenco di linguaggi

Elenco di linguaggi

Esercizio di apprendimento

Introduzione

L'array è una struttura dati mutabile che memorizza una raccolta di elementi di un tipo specifico. Un array è una struttura dati indicizzabile. Che gli array siano mutabili significa che, se su un array viene chiamato un metodo che lo modifica, l'array verrà modificato. Ovvero, non crea un nuovo array ma modifica quello esistente.

Per creare un array, usa la sintassi del letterale di array ([]) e al suo interno specifica gli elementi dell'array separati da una virgola.

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

Crystal deduce il tipo dell'array dagli elementi.

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

Array con più tipi

Anche se prima abbiamo detto che gli array sono una raccolta di elementi di un tipo specifico, puoi creare un array con più tipi usando i tipi unione. Questo permette all'array di contenere elementi di uno qualsiasi dei tipi specificati nel tipo unione. Crystal deduce il tipo dell'array dagli elementi.

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

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

Array multidimensionali

Un array multidimensionale è un array di array. Questo significa che ogni elemento dell'array è a sua volta un array. Può essere utile quando vuoi memorizzare dati in un formato tabellare. Per definire un array multidimensionale, puoi scrivere un letterale di array di array oppure usare il costruttore Array.new.

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

Aggiungere un elemento a un array

Per aggiungere un elemento a un array, usa l'operatore << (append).

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

Il tipo dell'elemento che vuoi aggiungere deve essere lo stesso del tipo dell'array; in caso contrario verrà generato un errore.

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

Dimensione di un array

Come con String, puoi ottenere la dimensione di un array usando il metodo size.

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

Array vuoti

Il compilatore non riesce a dedurre il tipo dell'array quando crei un array vuoto. Perciò devi specificare il tipo dell'array. Puoi farlo specificando il tipo dell'array con la parola chiave of, oppure usando la sintassi di inizializzazione dell'array, cioè Array(T).new.

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

Accedere agli elementi

Come con String, puoi accedere agli elementi di un array usando l'operatore [] (index) e passandogli l'indice dell'elemento a cui vuoi accedere. Se l'indice è fuori dai limiti, verrà generato un IndexError.

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

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

È anche possibile accedere agli elementi usando un intervallo.

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

Creare un array da un intervallo

Per creare un array da un intervallo, usa il metodo to_a. Può essere utile quando vuoi creare un array di numeri.

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

Creare un array da una stringa

Per creare un array da una stringa, usa il metodo split. Questo ti permette di dividere una stringa in un array di stringhe usando un delimitatore.

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

È anche possibile ottenere un array di caratteri da una stringa usando il metodo chars.

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

Per convertire un array di Char o String in una String puoi usare il metodo join, che accetta un delimitatore come argomento.

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

Eliminare un elemento da un array

Quando vuoi eliminare un elemento dalla fine di un array, puoi usare il metodo pop, che accetta un argomento opzionale che specifica quanti elementi rimuovere dalla fine dell'array. Il metodo restituisce l'elemento rimosso. Se l'array è vuoto, verrà generato un IndexError.

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

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

Quando vuoi eliminare da un array un elemento di un indice specifico, puoi usare il metodo delete_at, che accetta come argomento l'indice dell'elemento da rimuovere. Se l'array è vuoto, verrà generato 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)

Modificare i valori in un array

Quando vuoi modificare da un array un elemento di un indice specifico, puoi usare l'operatore []= (index assign), che accetta come argomenti l'indice dell'elemento da modificare e il nuovo valore. Se l'indice è fuori dai limiti, verrà generato un IndexError.

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

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

Istruzioni

In questo esercizio dovrai implementare alcuni metodi per manipolare un array di linguaggi di programmazione.

1. Definire un metodo che restituisca un array di linguaggi vuoto

Definisci il metodo LanguageList.list, che non accetta argomenti e restituisce un array vuoto di tipo Array(String).

LanguageList.list()
# => []

2. Definire un metodo per aggiungere un linguaggio all'array

Definisci il metodo LanguageList.add, che accetta 2 argomenti (un array di linguaggi e una stringa letterale che rappresenta un linguaggio). Il metodo deve restituire l'array con il nuovo linguaggio aggiunto alla fine.

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

3. Definire un metodo per rimuovere un linguaggio dall'array

Definisci il metodo LanguageList.remove, che accetta 1 argomento (un array di linguaggi). Il metodo deve restituire l'array senza l'ultimo elemento. Dai per scontato che l'array contenga sempre almeno 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"]

4. Definire un metodo che restituisca l'n-esimo elemento dell'array

Definisci la funzione LanguageList.at, che accetta 2 argomenti (un array di linguaggi e un indice). Il metodo deve restituire il linguaggio che si trova all'indice n dell'array. Dai per scontato che all'indice indicato ci sia sempre un linguaggio.

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. Definire un metodo per analizzare una stringa di linguaggi

Definisci il metodo LanguageList.parse, che accetta 1 argomento (una stringa letterale di linguaggi separati da una virgola). Il metodo deve restituire un array di linguaggi.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Crystal Exercism

Vuoi iniziare Elenco di linguaggi?

Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.