我有一个数组如下:
my_array = [
[value_1, value_2, value_3, value_4],
[value_n1, value_n2, value_n3, value_n4],
[value_x1, value_x2, value_x3, value_x4],
[value_y1, value_y2, value_y3, value_y4],
[value_z1, value_z2, value_z3, value_z4]
]
我发现数组有一些值,然后影响它们的值。例如:
some_value = 'xyz'
if my_array.map(&:first).include? some_value # I always compare 'some_value' with the first element of each array
# find the array
my_array.select{ |s| s.include? some_value }
# affect the values with position [1], [2], [3]
# ...
end
是否有一种简单的方法来提取数组并影响它们的值?
我有一个数组:
array = [ ['abc', 4, 5], ['xyz', 2, 10], ['ubf', 40, 9] ]
值:x = 'abc'
当我的变量'x'开始与我拥有的数组进行比较时,找到包含该值的数组。然后,应该将1添加到其他其他值。所以,我的预期结果是:
array = [ ['abc', **5**, **6**], ['xyz', 2, 10], ['ubf', 40, 9] ]
其他价值:x = 'ubf'
结果:array = [ ['abc', 5, 6], ['xyz', 2, 10], ['ubf', **41**, **10**] ]
答案 0 :(得分:1)
通过第一个元素查找子数组是Array#assoc
方法的工作。
增加以下元素的价值是一项简单的任务。可能的实施:
array = [ ['abc', 4, 5], ['xyz', 2, 10], ['ubf', 40, 9] ]
x = 'abc'
marr = array.assoc(x)
marr[1..-1] = marr.drop(1).map {|v| v+1} if marr
p array
# [["abc", 5, 6], ["xyz", 2, 10], ["ubf", 40, 9]]
答案 1 :(得分:0)
也许是这些方面的东西:
my_array.map{|a| a.include?(some_value) ? transform(a) : a }
def transform array
#return your modified array
end
如果您使用[[1,2],[2,3],[3,4]]
并且some_value
设置为3,则可以使用
def transform array do
array.map{|k| k + 1}
end
获取[[1,2], [3,4], [4,5]]
答案 2 :(得分:0)
根据你的问题编辑,我相信这就是你想要的。
my_array = [[5, 3, 1],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
val = 4
(ndx = my_array.transpose.first.index(val)) ?
((1..my_array[ndx].size-1).each { |i|
my_array[ndx][i] += 1 }; my_array) : nil
#=> [[5, 3, 1], [1, 2, 3], [4, 6, 7], [7, 8, 9]]
val = 7
(ndx = my_array.transpose.first.index(val)) ?
((1..my_array[ndx].size-1).each { |i|
my_array[ndx][i] += 1 }; my_array) : nil
#=> [[5, 3, 1], [1, 2, 3], [4, 5, 6], [7, 9, 10]]
val = 6
(ndx = my_array.transpose.first.index(val)) ?
((1..my_array[ndx].size-1).each { |i|
my_array[ndx][i] += 1 }; my_array) : nil
#=> nil
答案 3 :(得分:0)
如果您有一个数组但希望它以特殊方式运行,您可能需要考虑创建一个类。
class EGC < Array
def increment(val)
self.map do |sub|
if sub.first == val
[val, sub[1..-1].map(&:next)].flatten
else
sub
end
end
end
end
然后你可以这样做:
e = EGC.new([["foo", 1, 2], ["bar", 3, 4]])
#=> [["foo", 1, 2], ["bar", 3, 4]]
e.increment("foo")
#=> [["foo", 2, 3], ["bar", 3, 4]]
当然,您应该更改名称以更好地反映您的问题域。
话虽如此,看起来你最好先用Hash而不是2D数组开始。