Arrays 实现阵列平坦化
我需要实现Arrays 实现阵列平坦化,arrays,ruby,Arrays,Ruby,我需要实现数组#展平。此实现将删除所有嵌套数组: a = [1, 2, [3, [4, 5]]] def my_flatten(arr) arr.reduce([]) do |result, item| item.is_a?(Array) ? result + my_flatten(item) : result << item end end my_flatten(a) #=> [1, 2, 3, 4, 5] 很久以前我就创造了类似的东西。这是你的电话号
数组#展平
。此实现将删除所有嵌套数组:
a = [1, 2, [3, [4, 5]]]
def my_flatten(arr)
arr.reduce([]) do |result, item|
item.is_a?(Array) ? result + my_flatten(item) : result << item
end
end
my_flatten(a) #=> [1, 2, 3, 4, 5]
很久以前我就创造了类似的东西。这是你的电话号码 gist代码:
class Array
def my_flatten(level = nil)
rb_flatten(self, [], level)
end
private
# apply recursion based on the level
# when no level provided, then produce a complete flatten array
# when level is given, then produce a flatten array flattened till that certain level
def rb_flatten(array, result, level)
array.each do |value|
if ((value.is_a? Array) && (level.nil? || (level && level > 0)))
rb_flatten(value, result, (level.nil? ? level : ((level || 0 ) - 1)))
else
result << value
end
end
return result
end
end
类数组
def my_展平(级别=零)
rb_展平(自身,[],水平)
结束
私有的
#基于级别应用递归
#如果未提供级别,则生成完整的展平阵列
#当级别给定时,生成一个展平数组,展平到该特定级别
def rb_展平(阵列、结果、级别)
数组。每个do |值|
if((value.is|a?数组)&&&(level.nil?| |(level&&level>0)))
rb|U展平(值、结果,(level.nil??level:((level | | 0)-1)))
其他的
结果引入一个参数来指定最大深度(默认为nil
),并引入一个参数来跟踪当前深度(在初始调用时为0,然后在每次递归调用时递增1):
现在将返回预期结果:
my_flatten(a) #=> [1, 2, 3, 4, 5]
my_flatten(a, 1) #=> [1, 2, 3, [4, 5]]
您也可以像这样使用Proc
class Array
def my_flatten(level = nil)
p = ->(arr, exp, lvl) do
arr.each { |val| Array === val && (!level || lvl < level) ? p.(val, exp, lvl+1) : exp << val }
exp
end
p.(self, [], 0)
end
end
a = [1, 2, [3, [4, 5]]]
p a.my_flatten
# => [1, 2, 3, 4, 5]
p a.my_flatten(0)
# => [1, 2, [3, [4, 5]]]
p a.my_flatten(1)
# => [1, 2, 3, [4, 5]]
p a.my_flatten(2)
# => [1, 2, 3, 4, 5]
类数组
def my_展平(级别=零)
p=->(arr、exp、lvl)do
arr.each{val | Array==val&(!level | | lvl [1, 2, [3, [4, 5]]]
p.a.my_展平(1)
# => [1, 2, 3, [4, 5]]
p.a.my_展平(2)
# => [1, 2, 3, 4, 5]
def my_flatten(arr, max_depth = nil, current_depth = 0)
arr.reduce([]) do |result, item|
if item.is_a?(Array) && (max_depth.nil? || current_depth < max_depth)
result + my_flatten(item, max_depth, current_depth + 1)
else
result << item
end
end
end
my_flatten(a) #=> [1, 2, 3, 4, 5]
my_flatten(a, 1) #=> [1, 2, 3, [4, 5]]
class Array
def my_flatten(level = nil)
p = ->(arr, exp, lvl) do
arr.each { |val| Array === val && (!level || lvl < level) ? p.(val, exp, lvl+1) : exp << val }
exp
end
p.(self, [], 0)
end
end
a = [1, 2, [3, [4, 5]]]
p a.my_flatten
# => [1, 2, 3, 4, 5]
p a.my_flatten(0)
# => [1, 2, [3, [4, 5]]]
p a.my_flatten(1)
# => [1, 2, 3, [4, 5]]
p a.my_flatten(2)
# => [1, 2, 3, 4, 5]