Tracks
/
Crystal
Crystal
/
Übungen
/
Sprachenliste
Sprachenliste

Sprachenliste

Lernübung

Einführung

Array ist eine veränderbare Datenstruktur, die eine Sammlung von Elementen eines bestimmten Typs speichert. Ein Array ist eine indexierbare Datenstruktur. Dass Arrays veränderbar sind, bedeutet: Wenn du eine Methode auf einem Array aufrufst, die das Array verändert, wird das Array verändert. Das heißt, es wird kein neues Array erzeugt, sondern das vorhandene verändert.

Um ein Array zu erstellen, verwendest du die Literalschreibweise für Arrays ([]) und gibst darin die Elemente des Arrays durch Kommas getrennt an.

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

Crystal leitet den Typ des Arrays aus den Elementen ab.

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

Arrays mit mehreren Typen

Auch wenn weiter oben gesagt wurde, dass ein Array eine Sammlung von Elementen eines bestimmten Typs ist, kannst du mit Union-Typen ein Array mit mehreren Typen erstellen. Dadurch kann das Array Elemente von jedem der im Union-Typ angegebenen Typen enthalten. Crystal leitet den Typ des Arrays aus den Elementen ab.

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

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

Mehrdimensionale Arrays

Ein mehrdimensionales Array ist ein Array aus Arrays. Das bedeutet, dass jedes Element im Array selbst ein Array ist. Das kann nützlich sein, wenn du Daten in Tabellenform speichern möchtest. Um ein mehrdimensionales Array zu definieren, kannst du entweder ein Literal aus Arrays von Arrays schreiben oder den Konstruktor Array.new verwenden.

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

Ein Element zu einem Array hinzufügen

Um ein Element zu einem Array hinzuzufügen, verwendest du den <<-Operator (append).

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

Der Typ des Elements, das du hinzufügen möchtest, muss dem Typ des Arrays entsprechen; andernfalls wird ein Fehler ausgelöst.

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

Größe eines Arrays

Wie bei String kannst du die Größe eines Arrays mit der Methode size ermitteln.

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

Leere Arrays

Der Compiler kann den Array-Typ nicht ableiten, wenn du ein leeres Array erstellst. Deshalb musst du den Typ des Arrays angeben. Das kannst du tun, indem du den Typ des Arrays angibst, mit dem Schlüsselwort of, oder indem du die Array-Initialisierungssyntax Array(T).new verwendest.

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

Auf Elemente zugreifen

Wie bei String kannst du auf Elemente in einem Array zugreifen, indem du den []-Operator (Index) verwendest und ihm den Index des Elements übergibst, auf das du zugreifen möchtest. Wenn der Index außerhalb des gültigen Bereichs liegt, wird ein IndexError ausgelöst.

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

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

Du kannst auch mit einem Range auf Elemente zugreifen.

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

Ein Array aus einem Range erstellen

Um ein Array aus einem Range zu erstellen, verwendest du die Methode to_a. Das ist nützlich, wenn du ein Array aus Zahlen erstellen möchtest.

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

Ein Array aus einem String erstellen

Um ein Array aus einem String zu erstellen, verwendest du die Methode split. Damit kannst du einen String anhand eines Trennzeichens in ein Array aus Strings aufteilen.

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

Du kannst mit der Methode chars auch ein Array aus Zeichen aus einem String erhalten.

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

Um ein Array aus Char oder String in einen String umzuwandeln, kannst du die Methode join verwenden, die ein Trennzeichen als Argument entgegennimmt.

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

Ein Element aus einem Array löschen

Wenn du ein Element vom Ende eines Arrays löschen möchtest, kannst du die Methode pop verwenden. Sie nimmt ein optionales Argument entgegen, das angibt, wie viele Elemente vom Ende des Arrays entfernt werden sollen. Die Methode gibt das entfernte Element zurück. Wenn das Array leer ist, wird ein IndexError ausgelöst.

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

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

Wenn du ein Element an einem bestimmten Index aus einem Array löschen möchtest, kannst du die Methode delete_at verwenden, die den Index des zu entfernenden Elements als Argument entgegennimmt. Wenn das Array leer ist, wird ein IndexError ausgelöst.

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)

Werte in einem Array ändern

Wenn du ein Element an einem bestimmten Index in einem Array ändern möchtest, kannst du den []=-Operator (Index-Zuweisung) verwenden, der den Index des zu ändernden Elements und den neuen Wert als Argumente entgegennimmt. Wenn der Index außerhalb des gültigen Bereichs liegt, wird ein IndexError ausgelöst.

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

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

Anleitung

In dieser Übung implementierst du einige Methoden, um ein Array von Programmiersprachen zu bearbeiten.

1. Definiere eine Methode, die ein leeres Array für Programmiersprachen zurückgibt

Definiere die Methode LanguageList.list, die keine Argumente entgegennimmt und ein leeres Array vom Typ Array(String) zurückgibt.

LanguageList.list()
# => []

2. Definiere eine Methode, die eine Programmiersprache zum Array hinzufügt

Definiere die Methode LanguageList.add, die 2 Argumente entgegennimmt (ein Programmiersprachen-Array und ein String-Literal einer Programmiersprache). Die Methode sollte das Array mit der neuen Programmiersprache am Ende des Arrays zurückgeben.

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

3. Definiere eine Methode, die eine Programmiersprache aus dem Array entfernt

Definiere die Methode LanguageList.remove, die 1 Argument entgegennimmt (ein Programmiersprachen-Array). Die Methode sollte das Array ohne das letzte Element zurückgeben. Gehe davon aus, dass das Array immer mindestens ein Element enthält.

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. Definiere eine Methode, die das n-te Element im Array zurückgibt

Definiere die Funktion LanguageList.at, die 2 Argumente entgegennimmt (ein Programmiersprachen-Array und einen Index). Die Methode sollte die Programmiersprache am n-ten Index im Array zurückgeben. Gehe davon aus, dass an diesem Index immer eine Programmiersprache steht.

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. Definiere eine Methode, die einen String aus Programmiersprachen parst

Definiere die Methode LanguageList.parse, die 1 Argument entgegennimmt (ein String-Literal aus Programmiersprachen, die durch ein Komma getrennt sind). Die Methode sollte ein Array von Programmiersprachen zurückgeben.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Crystal Exercism

Bereit, mit Sprachenliste zu starten?

Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.