是否有一种优雅的方式来查找和替换多维数组中的任何超过3的整数(如示例)?该数组可能具有1,2,3或更多维数。只是一个这样的阵列的例子:在Ruby多维数组中查找并替换
[ [ [ 3, 3, 5 ],
[ 4, 3, 3 ] ],
[ [ 3, 2, 3 ],
[ 0, 3, 8 ] ] ]
我想这样做,而不是压扁阵列。
是否有一种优雅的方式来查找和替换多维数组中的任何超过3的整数(如示例)?该数组可能具有1,2,3或更多维数。只是一个这样的阵列的例子:在Ruby多维数组中查找并替换
[ [ [ 3, 3, 5 ],
[ 4, 3, 3 ] ],
[ [ 3, 2, 3 ],
[ 0, 3, 8 ] ] ]
我想这样做,而不是压扁阵列。
继sepp2k想法,这里是一个可能的实现:
class Object
def deep_map(&block)
if self.respond_to? :each
result = []
self.each do |e|
result << e.deep_map(&block)
end
return result
else
return block.call(self)
end
end
end
然后申请deep_map,你想在阵列上:
> [[[3, 3, 5], [4, 3, 3]], [[3, 2, 3], [0, 3, 8]]].deep_map { |e| e > 3 ? 0 : e }
=> [[[3, 3, 0], [0, 3, 3]], [[3, 2, 3], [0, 3, 0]]]
,或者更简单:
class Object
def deep_map(&block)
respond_to?(:map) ? map{|e| e.deep_map(&block)} : block.call(self)
end
end
或者,多态:
class Object
def deep_map(&block); block.call(self) end
end
class Array
def deep_map(&block); map{|e| e.deep_map(&block)} end
end
@ i-blis,如果你想要的话,我已经添加了你写的短版本。 – 2011-05-20 23:54:25
@韦恩,谢谢。让我们保持两个。 – 2011-05-21 08:23:31
这段代码太棒了。你真棒,伙计! – 2011-05-21 08:39:00
您可以编写一个deep_map
方法,该方法在数组上调用map
,然后为每个元素测试它是否是子数组。如果是,则使用子数组递归调用deep_map
,否则返回元素。
然后,您可以使用该deep_map
方法转换多维数组的内部元素而不影响其结构。
谢谢@ sepp2k! – 2011-05-21 08:37:45
所以,如果我这样做的权利,f(x)
会遍历多维数组,直到找到包含一个东西是不是一个阵列或子类阵列的,此时它会产生最里面的Array添加到块中,并将其替换为块的返回值。
def f x, &block
x.map do |a|
if a.first.class.ancestors.include? Array
f a, &block
else
yield a
end
end
end
p(f [ [ [ 3, 3, 5 ],
[ 4, 3, 3 ] ],
[ [ 3, 2, 3 ],
[ 0, 3, 8 ] ] ] do |e|
e.reject { |x| x > 3 }
end
)
谢谢@DigitalRoss。你的代码非常干净。但是,因为我的问题不是很清楚,所以我想保留数组结构。无论如何,再次感谢! – 2011-05-21 08:41:30
替换成什么? – sawa 2011-05-20 23:41:14
数字3(因为它是示例中所需的最大值)。 – 2011-05-21 08:09:50