2009-11-09 141 views
26

如何替換數組中的元素?如何替換數組的元素?

a = [1,2,3,4,5] 

我需要[11,22,33,44].flatten!

,將5-使a現在變成

a = [1,2,3,4,11,22,33,44] 
+1

請給我們一個解釋,爲什麼你需要做到這一點,在什麼情況下,這是 – Earlz 2009-11-10 00:06:25

+0

可能想改變標題,以我如何替換紅寶石'每個'風格迭代器中的數組元素 – peterk 2014-08-01 12:52:05

回答

42

不知道如果你正在尋找替代一個特定值或沒有,但這個工程:

a = [1, 2, 3, 4, 5] 
b = [11, 22, 33, 44] 
a.map! { |x| x == 5 ? b : x }.flatten! 

這種迭代的a的值,當它發現的5值,它用數組b替換該值,然後將數組平整爲一個數組。

+2

雖然這確實起作用,但它對原始海報試圖做的事情過於複雜。使用數組切片來替換範圍是一個更直接簡單的解決方案。看[這個答案](http://stackoverflow.com/a/1704805/456814)。 – 2014-03-27 08:08:50

+0

@Ryan McGeary我需要一個相同的方法,除了5的值我想用一個單詞「BINGO」替換數組3中的所有數字。怎麼做。我試過'ary =(0..100).to_a ary.map!{| i |我%3 == 0?我:「BINGO」}'它取代了所有除了那些可以被3 – DebRaj 2016-02-13 12:46:25

+0

整除的作品,就像我的魅力!謝謝! – ramya 2016-03-03 06:17:22

0

gweg,不知道你想在這裏做什麼,但你尋找類似這個?

a = [1, 2, 3, 4, 5] 
a.delete_at(4) 
a = a.concat([11,22,33,44]) 

有許多這樣做的方法 - 我不認爲上面的代碼是特別好看。這一切都取決於原始數組中'5'的重要性。

18

也許你的意思是:

a[4] = [11,22,33,44] # or a[-1] = ... 
a.flatten! 

功能性解決方案可能是更好的,如何只:

a[0..-2] + [11, 22, 33, 44] 

這將產生...

=> [1, 2, 3, 4, 11, 22, 33, 44] 
+1

+1好! !只是一個小的更正,在第一行它是'a [4]'不''[5]' – alfasin 2013-04-14 09:20:55

+0

羅傑,固定... – DigitalRoss 2013-04-14 10:22:59

+1

+1謝謝!當我想在數組中的一個可變位置上用兩個值替換單個元素時,函數解決方案更具適應性,即:a [0..b-1] + [val1,val2] + [b + 1 .. -1] – mm2001 2014-01-29 05:42:04

5

你真的不如果你只是連接在一起,必須扁平化。所以修整最後一個元素關閉第一陣列和將它們連接起來:

a = [ 1, 2, 3, 4, 5 ]   #=> [1, 2, 3, 4, 5] 
t = [11, 22, 33, 44]   #=> [11, 22, 33, 44] 
result = a[0..-2] + t   #=> [1, 2, 3, 4, 11, 22, 33, 44] 

一個[0 ..- 2]是一個切片的操作,通吃但所述陣列的最後一個元素。

希望它能幫助!

5

無論數組在哪裏,該變體都會找到5

a = [1, 2, 3, 4, 5] 
a[a.index(5)]=[11, 22, 33, 44] if a.index(5) 
a.flatten! 
14

使用a.index的的bta版本(5)是最快的一個:比的一個Ryan McGeary更快

a[a.index(5)] = b if a.index(5) # 5.133327 sec/10^6 

至少10%:

a.map!{ |x| x == 5 ? b : x } # 5.647182 sec/10^6 

然而,請注意,一個.index(5)僅返回找到5的第一個索引。 所以,給出,其中5出現一次以上的陣列,結果將是不同的:

a = [1, 2, 3, 4, 5, 5] 
b = [11,22,33,44] 

a[a.index(5)] = b if a.index(5) 
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 5] 

a.map!{ |x| x == 5 ? b : x } 
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 11, 22, 33, 44] 
6

Array#delete將返回的項目或爲零。你可以使用這個知道是否要推新的價值觀

a.push 11,22,33,44 if a.delete 5 
+0

這是非常乾淨,不錯的工作! – bagofcole 2017-04-25 19:03:18

1

這裏是另一種簡單的方法來替代數組中的值5

a[-1, 1] = [11, 22, 33, 44] 

它使用Array#[]=方法。我不確定它爲什麼可以工作。