Fórumok
Egy 2 dimenziós string tömb legegyszerűbb megvalósítására lennék kíváncsi Rubyban.
Kerestem rá megoldást neten, de annyiféle szart írnak össze róla, hogy egyszerűen kész.
Amit szeretnék megoldani, hogy számozással tudjak egy tömb adott elemére hivatkozni, mely egy szöveget tartalmaz.
Pl. a [2,1] valakinek a neve, a [2,2] ugyanannak a címe, a [2,3] ugyanannak a telefonszáma,
de a [3,1] más valakinek a neve, a [3,2] ennek a személynek a címe, és a [3,3] szintén eme 3. személynek a telefonszáma. És így tovább.
Egy ilyen tömbre lenne szükségem, és ezekre az elemekre szeretnék hivatkozni.
String adatott tenni bele, de nem előre dekraláltan, hanem utólag feltölteni.
Valaki tudna ebben egy picit segíteni nagyon egyszerű módon?
Köszönöm előre is!
Hozzászólások
Előre szólok, rubyhoz hülye vagyok, de ha van egy dimenziós tömböd, akkor minden van. Assembly-ben hogyan csinálnád? Legyen egy n * m-es tömböd, ekkor így hivatkozhatsz egy egy dimenziós implementációban az a[y, x] elemre:
a[y * m + x]
ahol
0 <= y < n
és
0 <= x < m
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Ezt keresed talán (tömb a tömbben):
adat = [ ["Nagy József", "1105 Budapest, Kató u. 10", "+36 70 112 22 33"], ["Kis Miklós", "Pécs, Kőrös út 45.", "+36 30 441 22 33"], [...] ]
adat[1,1] => "Nagy József"
adat[2,1] => "Kis Miklós"
adat[2,2] => "Pécs, Kőrös út 45."
Hozzáadás:
adat.push( ["Németh Elemér", "", ""] )
igen, de 0-tol indul az index
nem, ez egyaltalan nem jo. Ez igy start + length parameter. https://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-5B-5D
Jaj, bocs hülyeséget írtam, siettem :) egyrészt igen, nullától indul, másrészt data[0][1] :)
Valami ilyesmi nem lenne jobb inkabb?
Ha a hash-ek megfelelnek neki a tömb helyett, akkor még akár ilyen struktúra is érdekes lehet (hash a hash-ben):
adat = {"Nagy István" => {"cim" => "Pécs, Virág u. 8.", "tel" => "+36 20 11 22 333"}, "Kis Péter" => {"cim" => "Bp, Kossuth u. 111.", "tel" => "+36 30 55 44 333"}}
adat["Nagy István"]["tel"]
=> "+36 20 11 22 333"
adat["Kis Péter"]["cim"]
=> "Bp, Kossuth u. 111."
Egy gyors kérdésem lenne még. Adott a következő:
ADAT = [
{:nev => '',:cim => '',:tel => ''},
{:nev => '',:cim => '',:tel => ''},
{:nev => '',:cim => '',:tel => ''}
]
Tökéletesen működik, de ahhoz hogy az adott környezete működni tudjon, előre kell ilyen módon deklarálnom a tömböt üres elemekkel.
A kérdésem pedig a következő:
Melyik lenne a legegyszerűbb módszer (akár ciklus, akár másféle egyszerű dolog) amivel deklarálni tudnám ezeket az üres tömb elemeket, pl. ha 52 "sorra" lenne szükségem? És azt miként tudnám megvalósítani, a legegyszerűbb módon?
Köszönet a válaszokért!
Üdvözlettel,
Balázs
Ha jobban megnézed, akkor ott van a válasz a kérésedre, de itt egy újabb példa, hátha így átjön :)
Köszönöm. Ez tetszik. Átlátható.
Sajnos a jelenlegi helyzetben nem segít. Lentebb leírtam miért, de mindenféleképp hasznos, hogy jobban megismerjem a Rubyt. Talán ennek alapján összetudom gyúrni a kellő ciklust.
Köszönöm!
Sikerült megoldani a következő módszerrel:
ADAT = []
i = 0
begin
ADAT << {:nev => '',:cim => '',:tel => ''}
i += 1
end until i > 51
Köszönet mindenért!
Üdv,
Balázs
Esetleg:
tomb = Array.new(52)
print "Tomb merete: #{tomb.length}\n"
De akkor az adatok feltültése nem a << -vel történjen, hanem tomb[32] = {:nev => 'Nev 1', :cim => 'Cim 1', :tel => 'Tel 1'}
Nem kell előre deklarálnod semmit. Csinálsz egy üres hash-t és majd azt teszel bele amit akarsz:
adat = {}
Ami megzavar téged szerintem az az, hogy nem tudod hogy bármilyen különböző struktúra lehet bármilyen elemben, ráadásul akármilyen mélyen egymásba ágyazva. Tehát Ruby is több más nyelvhez hasonlóan teljesen megengedő és a fejlesztő maximális kényelmét és hatékonyságát szolgálja. Lásd a következőt:
adat = ["hello", 55, 3.14]
adat += [[1,2,3,4], "ez egy teszt"]
Az eredmény => ["hello", 55, 3.14, [1, 2, 3, 4], "ez egy teszt"]
Ugyanez van hash esetében is:
adat = {}
adat["Besenyő István"] = {:cim => "Szeged, Károly út 51", :tel => "+36 ..."}
adat["Nagy Miklós"] = {:eletkor => 44, "kedvenc szín" => "zöld"}
adat[:teszt] = "Ez egy naaagy teszt.."
adat["akármi"] = rand(100)
Nagyon szépen köszönöm a példákat, és valóban kicsit számomra az a zavaró, hogy a Rubyt nem ismervén nem szoktam hozzá, hogy ennyire megengedő.
Viszont a helyzet, hogy egy már előre megírt komolyabb ruby forráskódba szeretnék változtatni pár sort, ami szerencsére egész jól összejött, azt az egy dolgot kivéve, hogy egyáltalán nem működik a program, ha nincs előre megadva, milyen, és mennyi elem van az adott tömbben. Így most a legegyszerűbb számomra hogy előre megadom ezeket az adatokat üres értékekkel, de elég otrombán nézne ki egy több száz elemű tömb esetében több száz ilyen {:nev => '',:cim => '',:tel => ''} sor.
Miként tudnám ezt megoldani?
Szerintem előbb csinálj végig egy ruby tutorialt, mielőtt egy nagy programba nyúlsz, mindenki jobban jár. Hacsak nem osztod meg velünk az egész programot, a félinformációra alapozott tanács simán rossz irányba fog elvinni.
--
+1
Tökéletesen működik az a minimális változtatás amit eszközölni szerettem volna.
Ha lesz rá időm és kedvem is akkor fogok foglalkozni rubyval komolyabban, de most van más dolgom.
Amúgy jogosnak mondható amit írtál, de nem segít :)
Köszönöm mindenkinek a segítséget!
Egy órát szoptam azon hogy ha nem raktam $ kezdést akkor nagybetűvel kellett írnom a tömb nevét, hogy működjön stringként az adott környezetben :D
De sikerült felhasználnom az itt leírt ötleteket, köszönöm mindenkinek még egyszer a segítséget.
Nagybetűvel a konstans értéket kell írnod. A $név globális változót ad. Valszeg más elírás volt ott, $ jellel is mennie kellett volna.