2009-11-09 146 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#[]=方法。我不确定它为什么可以工作。