2014-10-16 33 views
6

Ho un array con elementi univoci. C'è un modo per sostituire un certo valore in esso con un altro valore senza utilizzare il suo valore di indice?Sostituire un singolo elemento in un array

Esempi:

array = [1,2,3,4] 
if array.include? 4 
# "replace 4 with 'Z'" 
end 
array #=> [1,2,3,'Z'] 

hash = {"One" => [1,2,3,4]} 
if hash["One"].include? 4 
# "replace 4 with 'Z'" 
end 
hash #=> {"One" => [1,2,3,'Z']} 
+0

cosa sei cercando qui: 'array = [1,4,4]; se array.include? 4 # sostituisci 4 con 'Z''? –

+0

@CarySwoveland Sì, ho solo bisogno di sostituire il 4 (s) con un altro elemento di mia scelta. [1,4,4] => [1, 'Z', 'Z'] – Lasonic

+0

Ho pensato che solo la prima di tali istanze dovrebbe essere sostituita poiché il titolo dice "elemento singolo". Ma non risulta. – sawa

risposta

12
p array.map { |x| x == 4 ? 'Z' : x } 

# => [1, 2, 3, 'Z'] 
+1

Perché passare attraverso l'intero array se il primo elemento è uguale a 4? –

4

È possibile utilizzare Array#map

array = array.map do |e| 
    if e == 4 
    'Z' 
    else 
    e 
    end 
end 

di modificare l'array in posizione, piuttosto che creare un nuovo array, utilizzare Array#map!

Se si dispone di più di un cosa vuoi sostituire, puoi usare un hash per mappare il vecchio al nuovo:

replacements = { 
    4 => 'Z', 
    5 => 'five', 
} 
array = array.map do |e| 
    replacements.fetch(e, e) 
end 

Questo rende utilizza una funzionalità di Hash#fetch, dove se la chiave non viene trovata, il secondo argomento viene utilizzato come predefinito.

+0

Cosa succede se il mio array si trova in un hash come nell'aggiornamento? – Lasonic

+1

@Lasonic Quindi: 'hash ['chiave']. Mappa! fare | e | ... end' –

2

una soluzione molto semplice che presuppone non ci saranno duplicati e che l'ordine non ha importanza:

hash = { 'One' => [1, 2, 3, 4] } 

hash['One'].instance_eval { push 'Z' if delete 4 } 
+1

E se non fosse l'ultimo elemento dell'array? – Lasonic

+0

Qual è il motivo del voto negativo? –

+1

Non lo farei in questo modo, ma è interessante. Forse abbiamo un downgoter canaglia in mezzo a noi. –

5

Puoi farlo come:

array[array.index(4)] = "Z" 

Se l'elemento non è necessariamente nella matrice, quindi

if i = array.index(4) 
    array[i] = "Z" 
end 
+0

Ha detto che non voleva usare il valore dell'indice dell'oggetto. –

+2

Mentre sono d'accordo con te, penso che il tuo commento sia un po 'duro. –

+0

@MarkThomas Forse. Ma sospetto che il post sia stato accompagnato da un downvote, il che ha peggiorato la situazione. – sawa

Problemi correlati