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)
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)
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á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 String-hez hasonlóan lekérdezheted a tömb méretét a size metódussal.
[1, 2, 3].size # => 3
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 # => []
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]
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]
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"
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)
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)
Ebben a feladatban néhány metódust kell megvalósítanod, amelyek egy programozási nyelveket tartalmazó tömbbel dolgoznak.
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()
# => []
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"]
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"]
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"
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"]
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.