如何替换数组的元素?

时间:2009-11-09 23:55:20

标签: ruby arrays

如何替换数组中的元素?

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

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

替换5

以便a现在成为

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

8 个答案:

答案 0 :(得分:43)

不确定您是否要替换特定值,但这有效:

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

这会迭代a的值,当它找到值5时,它会将该值替换为数组b,然后将数组展平为一个数组。

答案 1 :(得分: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]

答案 2 :(得分:14)

使用a.index(5)的bta版本是最快的版本:

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

Ryan McGeary的速度快至少10%:

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

但请注意,a.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]

答案 3 :(得分:6)

Array#delete将返回该项目或为零。您可以使用它来了解是否推送新值

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

答案 4 :(得分: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]

a [0 ..- 2]是一个切片操作,它接受除数组的最后一个元素之外的所有元素。

希望它有所帮助!

答案 5 :(得分:5)

无论数组位于何处,此变体都会找到5

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

答案 6 :(得分:1)

以下是另一种替换数组中值5的简单方法:

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

这使用Array#[]=方法。我不确定它为什么会起作用。

答案 7 :(得分:0)

gweg,不确定你在这里做什么,但是你在找这样的东西吗?

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

有很多方法可以做到这一点 - 我不认为上面的代码特别好看。这完全取决于原始数组中“5”的重要性。