Nyelvlista

Nyelvlista

Tanulófeladat

Bevezetés

A tömb egy módosítható adatszerkezet, amely egy adott típusú elemek gyűjteményét tárolja. A tömb egy indexelhető adatszerkezet. A tömbök módosíthatósága azt jelenti, hogy ha meghívunk egy metódust egy tömbre, amely módosítja a tömböt, akkor a tömb módosul. Ez azt jelenti, hogy nem hoz létre új tömböt, hanem a meglévőt módosítja.

Tömb létrehozásához használd a tömb literál jelölés szintaxisát ([]), és azon belül add meg a tömb elemeit vesszővel elválasztva.

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

A Crystal az elemekből következteti ki a tömb típusát.

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

Több típusú tömbök

Bár korábban említettük, hogy a tömbök egy adott típusú elemek gyűjteményei, létrehozhatsz több típust tartalmazó tömböt unió típusok használatával. Ez lehetővé teszi, hogy a tömb az unió típusban szereplő bármelyik típusú elemet tartalmazza. A Crystal az elemekből következteti ki a tömb típusát.

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

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

Többdimenziós tömbök

A többdimenziós tömbök tömbökből álló tömbök. Ez azt jelenti, hogy a tömbben minden elem maga is egy tömb. Ez hasznos lehet, ha táblázatos formátumban szeretnél adatokat tárolni. Többdimenziós tömb definiálásához vagy leírhatsz egy tömbökből álló tömb literált, vagy használhatod az Array.new konstruktort.

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

Elem hozzáadása egy tömbhöz

Elem hozzáadásához egy tömbhöz használd a << (hozzáfűzés) operátort.

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

A hozzáadni kívánt elem típusának meg kell egyeznie a tömb típusával, különben hiba keletkezik.

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

A tömb mérete

A String-hez hasonlóan lekérdezheted a tömb méretét a size metódussal.

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

Üres tömbök

A fordító nem tudja kikövetkeztetni a tömb típusát üres tömb létrehozásakor. Ezért meg kell adnod a tömb típusát. Ezt megteheted úgy, hogy megadod a tömb típusát az of kulcsszóval, vagy használod a tömb inicializáló szintaxisát, ami Array(T).new.

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

Elemek elérése

A String-hez hasonlóan a tömb elemeit a [] (index) operátorral érheted el, megadva az elérni kívánt elem indexét. Ha az index kívül esik a megengedett tartományon, IndexError keletkezik.

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

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

Lehetőség van arra is, hogy tartomány segítségével érj el elemeket.

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

Tömb létrehozása tartományból

Ha tartományból szeretnél tömböt létrehozni, használd a to_a metódust. Ez hasznos lehet, ha számokból álló tömböt szeretnél létrehozni.

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

Tömb létrehozása stringből

Ha stringből szeretnél tömböt létrehozni, használd a split metódust. Ezzel egy stringet stringek tömbjévé bonthatsz egy elválasztó segítségével.

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

Lehetőség van arra is, hogy egy stringből karakterek tömbjét kapd meg a chars metódussal.

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

Ha Char vagy String típusú elemek tömbjét String-gé szeretnéd alakítani, használhatod a join metódust, amely egy elválasztót vár argumentumként.

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

Elem törlése egy tömbből

Ha egy tömb végéről szeretnél elemet törölni, használhatod a pop metódust, amely egy opcionális argumentumot fogad, megadva, hogy hány elemet távolítson el a tömb végéről. A metódus visszaadja az eltávolított elemet. Ha a tömb üres, IndexError keletkezik.

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

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

Ha egy adott indexű elemet szeretnél törölni egy tömbből, használhatod a delete_at metódust, amely argumentumként az eltávolítandó elem indexét várja. Ha a tömb üres, IndexError keletkezik.

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)

Értékek módosítása egy tömbben

Ha egy adott indexű elemet szeretnél módosítani egy tömbben, használhatod a []= (index értékadás) operátort, amely argumentumként a módosítandó elem indexét és az új értéket várja. Ha az index kívül esik a megengedett tartományon, IndexError keletkezik.

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

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

Utasítások

Ebben a feladatban néhány metódust kell megvalósítanod, amelyek egy programozási nyelveket tartalmazó tömbbel dolgoznak.

1. Definiálj egy metódust, amely egy üres nyelvtömböt ad vissza

Definiáld a LanguageList.list metódust, amely nem vesz át argumentumot, és egy üres, Array(String) típusú tömböt ad vissza.

LanguageList.list()
# => []

2. Definiálj egy metódust, amely hozzáad egy nyelvet a tömbhöz

Definiáld a LanguageList.add metódust, amely 2 argumentumot vesz át (egy nyelvtömböt és egy nyelv string literálját). A metódusnak vissza kell adnia a tömböt úgy, hogy az új nyelv a tömb végére került.

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

3. Definiálj egy metódust, amely eltávolít egy nyelvet a tömbből

Definiáld a LanguageList.remove metódust, amely 1 argumentumot vesz át (egy nyelvtömböt). A metódusnak a tömböt az utolsó elem nélkül kell visszaadnia. Feltételezzük, hogy a tömbben mindig van legalább egy elem.

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. Definiálj egy metódust, amely visszaadja a tömb n-edik elemét

Definiáld a LanguageList.at függvényt, amely 2 argumentumot vesz át (egy nyelvtömböt és egy indexet). A metódusnak a tömbben az n-edik indexen lévő nyelvet kell visszaadnia. Feltételezzük, hogy az adott indexen mindig lesz nyelv.

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. Definiálj egy metódust, amely feldolgozza a nyelvek egy stringjét

Definiáld a LanguageList.parse metódust, amely 1 argumentumot vesz át (egy vesszővel elválasztott nyelvekből álló string literált). A metódusnak egy nyelvekből álló tömböt kell visszaadnia.

LanguageList.parse("Crystal, Ruby")
# => ["Crystal", "Ruby"]
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Nyelvlista feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.