2014-10-16 37 views
6

Mam tablicę z unikatowymi elementami. Czy istnieje sposób na zastąpienie określonej wartości inną wartością bez użycia jej wartości indeksu?Zamień jeden element w tablicy

Przykłady:

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

Co ty szukam tutaj: 'tablica = [1,4,4]; jeśli array.include? 4 # wymienić 4 na "Z''? –

+0

@CarySwoveland Tak, muszę tylko wymienić 4 (y) na inny element z mojego wyboru. [1,4,4] => [1, "Z", "Z"] – Lasonic

+0

Myślałem, że tylko pierwsza z takich instancji powinna zostać zastąpiona, ponieważ tytuł mówi "jeden element". Ale okazuje się, że nie. – sawa

Odpowiedz

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

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

Po co przechodzić przez całą tablicę, jeśli pierwszy element jest równy 4? –

4

Można używać Array#map

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

edytować tablicę w miejscu, zamiast tworzyć nową tablicę, użyj Array#map!

Jeśli masz więcej niż jeden rzecz, którą chcesz zastąpić, możesz użyć skrótu do odwzorowania starego na nowy:

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

To powoduje użycie funkcji z Hash#fetch, gdzie jeśli klucz nie zostanie znaleziony, drugi argument zostanie użyty jako domyślny.

+0

Co zrobić, jeśli moja tablica znajduje się w mieszaniu, tak jak w aktualizacji? – Lasonic

+1

@Lasonic Następnie: 'hash ['key']. Map! do | e | ... end' –

2

bardzo proste rozwiązanie, które zakłada nie będzie duplikatów i że kolejność nie ma znaczenia:

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

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

Co jeśli to nie jest ostatni element w tablicy? – Lasonic

+0

Jaki jest powód głosowania w dół? –

+1

Nie zrobiłbym tego w ten sposób, ale to jest interesujące. Być może pośród nas jest fałszywy downvoter. –

5

Można to zrobić jako:

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

Jeśli element nie jest koniecznie w tablicy, a następnie

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

Powiedział, że nie chce używać wartości indeksu przedmiotu. –

+2

Chociaż zgadzam się z tobą, myślę, że twój komentarz jest nieco szorstki. –

+0

@MarkThomas Może. Ale podejrzewam, że postowi towarzyszył głos, co pogorszyło sytuację. – sawa

Powiązane problemy