2017-01-04 5 views
-2

Array#flattenを実装する必要があります。この実装は、すべてのネストされた配列を削除します。Array#flattenの実装

、このような動作を実装する方法

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.flatten(1) #=> [1, 2, 3, [4, 5]] 

答えて

3

(各再帰呼び出しの1だけインクリメント次いで0最初のコールに及び)(nilをデフォルト)最大深さを指定するパラメータを導入し、現在の深さを追跡するために、パラメータ:

def my_flatten(arr, max_depth = nil, current_depth = 0) 
    arr.reduce([]) do |result, item| 
     item.is_a?(Array) && (max_depth.nil? || current_depth < max_depth) ? 
     result + my_flatten(item, max_depth, current_depth + 1) : result << item 
    end 
end 

あなたはこれをより読みだと感じた場合は、if/else?:を置き換えることができます:

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]] 
2

私は長い間戻って同様のものを作成しました。ここにはgist linkがあります。主旨から

コード:

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 

お役に立てば幸いです。

1

このように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]