nel quale associo ad una coppia di citta i kilometri
esempio @strade[[“milano”,“roma”]] = [650, 800]
vuolre dire che ci sono due strade da milano a roma, una di 600 km e una
di 800 km.
in un controllo ho notato che il sistema non fa distinzione tra @strade[[“milano”,“roma”]] e @strade[[“roma”,“milano”]] e ho bisogno che
siano due cose distinte, anche perchè ci possono essere ulteriori strade
e ulteriori kilometri… come posso fare?
in un controllo ho notato che il sistema non fa distinzione tra @strade[[“milano”,“roma”]] e @strade[[“roma”,“milano”]] e ho bisogno che
siano due cose distinte, anche perchè ci possono essere ulteriori strade
e ulteriori kilometri… come posso fare?
ciao, non è quello che hai chiesto, ma perché non usare una hash tipo
{“Roma” => {“Milano”, …}, …}?
i dati in che forma li hai?
riguardo alla domanda, non mi viene in mente una soluzione usando
Array; che ne dici di costruire la chiave, ad esempio “Roma | Milano”?
ciao Pietro, come faccio a costruire la chiave “Roma | Milano”? ho
proprio esigenza di associare ad una coppia di dati più valori che
sarebbero i chilometri
in un controllo ho notato che il sistema non fa distinzione tra @strade[[“milano”,“roma”]] e @strade[[“roma”,“milano”]] e ho bisogno che
siano due cose distinte, anche perch� ci possono essere ulteriori strade
e ulteriori kilometri… come posso fare?
ciao, non � quello che hai chiesto, ma perch� non usare una hash tipo
{“Roma” => {“Milano”, …}, …}?
i dati in che forma li hai?
riguardo alla domanda, non mi viene in mente una soluzione usando
Array; che ne dici di costruire la chiave, ad esempio “Roma | Milano”?
ciao Pietro, come faccio a costruire la chiave “Roma | Milano”? ho
proprio esigenza di associare ad una coppia di dati più valori che
sarebbero i chilometri
Non so se sia quello che serve a te, ma riprendendo quanto detto da njna
ti
faccio un semplice esempio utilizzando le Hash.
ciao Pietro, come faccio a costruire la chiave “Roma | Milano”? ho
proprio esigenza di associare ad una coppia di dati più valori che
sarebbero i chilometri
Perchè non creare invece un oggetto Itinerario, con due attributi
(@partenza e @arrivo, ad esempio)?
A quel punto useresti un’istanza di quell’oggetto come chiave e saresti
libero di definire le condizioni di identità di due oggetti.
E soprattutto avresti codice molto più pulito e object oriented.
ciao Pietro, come faccio a costruire la chiave “Roma | Milano”? ho
proprio esigenza di associare ad una coppia di dati pi� valori che
sarebbero i chilometri
Non so se sia quello che serve a te, ma riprendendo quanto detto da njna
ti
faccio un semplice esempio utilizzando le Hash.
andrea riesci a farmi un esempio di come faresti tu? così mi schiarisco
le idee che ho un sacco di confusione
grazie mille
Andrea C. wrote:
On Fri, 5 Dec 2008 14:59:36 +0100, Njna N. wrote:
ciao Pietro, come faccio a costruire la chiave “Roma | Milano”? ho
proprio esigenza di associare ad una coppia di dati pi� valori che
sarebbero i chilometri
Perch� non creare invece un oggetto Itinerario, con due attributi
(@partenza e @arrivo, ad esempio)?
A quel punto useresti un’istanza di quell’oggetto come chiave e saresti
libero di definire le condizioni di identit� di due oggetti.
E soprattutto avresti codice molto pi� pulito e object oriented.
Perfetto, funziona!!! grazie a tutti!!!
solo più una domanda… perchè non sempre è necessario definire l’hash
in quel modo?
uso spesso l’hash ma non mi era mai capitata l’esigenza di una
inizializzazione del genere… come mai?
ancora grazie!!
Pierpaolo S. wrote:
Ciao,
secondo me il problema sta nel modo in cui inizializzi l’hash @strade = Hash([])
cos� assegni lo stesso array per tuttu le chiavi dell’hash.Per assegnare
un
array diverso per ogni chiave devi fare cos� @strade = Hash.new {|h,k| h[k] = []}
Ciao,
secondo me il problema sta nel modo in cui inizializzi l’hash @strade = Hash([])
così assegni lo stesso array per tuttu le chiavi dell’hash.Per assegnare
un
array diverso per ogni chiave devi fare così @strade = Hash.new {|h,k| h[k] = []}
ok ma quando basta mettere Hash{} e quando invece è necessario
specificare tra parentesi una cosa del genere? {|h,k| h[k] = []}
Credo si stia fecendo un pochino di confusione.
Guardando la documentazione ufficiale sulla classe
Hashhttp://www.ruby-doc.org/core/classes/Hash.htmlse specifichi una
cosa del genere significa che per ogni chiave non
specificata avrai un array vuoto, cioè []. Ecco un esempio
Come vedi, per la chiave Bologna non è ancora stata definita una chiave,
quindi mi ritorna il default che è stato definito come array vuoto, cioè [].
La seconda notazione che chiedi è un pochino più potente, ma in questo caso
non cambia nulla.
viene ustao lo stesso oggetto (obj) per tutti i valori di default.
Invece
con
Hash.new {|h,k| …}
ogni volta che richiedi il valore di una chiave non ancora presente
nell’hash viene chiamato il blocco, che dovrebbe restituire il valore di
default, ma in questo caso è un oggetto differente di volta in volta.
io utilizzo questa forma
h = Hash.new {|h,k| h[k] = []}
perchè così non devo preoccuparmi di fare i controlli sulla chiave prima di
appendere un elemento nell’array , cioè posso semplicamente fare così
h[“nouva chiave”] << “elemento da appendere”
in questo modo se la chiave è già presente, il nuovo elemento viene accodato
all’array, se la chiave non è presente viene creato un nuovo array e poi
inserito l’elemento
altrimenti dovrei fare così
if h.has_key?(“nouva chiave”)
h << “elemento da appendere”
else
h["nuova chiave] = []
h["nuova chiave] << “elemento da appendere”
end
ogni volta che richiedi il valore di una chiave non ancora presente
nell’hash viene chiamato il blocco, che dovrebbe restituire il valore di
default, ma in questo caso è un oggetto differente di volta in volta.
Aggiungo: probabilmente non ti sei mai scontrato con il problema
perché usavi come valore predefinito un oggetto immutabile, ad esempio un
numero.
Per cui facendo
hsh = Hash.new(0)
hsh[:foo] +=1
puts hsh[:foo], hsh[:bar] #=> 1 0
In questo caso non stavi modificando l’oggetto “0” ma lo stavi
sostituendo con l’oggetto “1”, mentre nel caso degli array il
cambiamento avveniva nell’oggetto immagazzinato come valore.