2014-09-04 28 views
0

我有這樣的陣列執行以下操作:陣列陣列,個別陣列紅寶石

[["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]] 

我需要拉所有這些陣列的出母體的,成單獨的陣列,這樣的:

["red", "green", "blue"] ["small", "large", "medium"] ["loose", "tight"] 

程序不會總是知道父數組中有多少個子數組,因爲它們是動態創建的。

的最終目標是把第一陣列(紅,綠,藍,等...),並呼籲它.product,傳遞以下所有陣列,獨立,所以我結束了以下內容:

"red small loose", "red small right", "red large loose", etc..

+1

這是可能的,是的。問題變成了,你想如何存儲每個數組?你對這些數據做什麼需要分離出來? – 2014-09-04 15:03:47

+0

我想孩子數組保持爲數組,但不是在父母。我試圖在第一個數組上調用'product'並單獨傳遞其餘的數組。 – jmcharnes 2014-09-04 15:04:58

+0

@jmcharnes也許你可以編輯你的問題來詳細解釋這個目標。 (這是完全可能的,但也不是特別困難。) – Ajedi32 2014-09-04 15:07:14

回答

4

這會工作:

arrays = [["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]] 

first, *others = arrays 
first.product(*others).map { |s| s.join(' ') } 
#=> ["red small loose", "red small tight", "red large loose", "red large tight", "red medium loose", "red medium tight", "green small loose", "green small tight", "green large loose", "green large tight", "green medium loose", "green medium tight", "blue small loose", "blue small tight", "blue large loose", "blue large tight", "blue medium loose", "blue medium tight"] 

或者無臨時變量:

arrays[0].product(*arrays[1..-1]).map { |s| s.join(' ') } 

請注意,product的參數前綴爲*。這被稱爲splat operator - 它將數組變成參數列表。

0

我認爲你可以這樣做:

2.1.0 :001 > parent_array = [["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]] 
=> [["red", "green", "blue"], ["small", "large", "medium"], ["loose", "tight"]] 
2.1.0 :002 > first_array = parent_array.shift 
=> ["red", "green", "blue"] 
2.1.0 :003 > first_array 
=> ["red", "green", "blue"] 
2.1.0 :004 > parent_array 
=> [["small", "large", "medium"], ["loose", "tight"]] 

# Use the splat operator (*) 
2.1.0 :006 > product = first_array.product(*parent_array) 
=> [["red", "small", "loose"], ["red", "small", "tight"], ["red", "large", "loose"], ["red", "large", "tight"], ["red", "medium", "loose"], ["red", "medium", "tight"], ["green", "small", "loose"], ["green", "small", "tight"], ["green", "large", "loose"], ["green", "large", "tight"], ["green", "medium", "loose"], ["green", "medium", "tight"], ["blue", "small", "loose"], ["blue", "small", "tight"], ["blue", "large", "loose"], ["blue", "large", "tight"], ["blue", "medium", "loose"], ["blue", "medium", "tight"]] 
2.1.0 :007 > result = product.map {|array| array.join(' ') } 
=> ["red small loose", "red small tight", "red large loose", "red large tight", "red medium loose", "red medium tight", "green small loose", "green small tight", "green large loose", "green large tight", "green medium loose", "green medium tight", "blue small loose", "blue small tight", "blue large loose", "blue large tight", "blue medium loose", "blue medium tight"] 
0

這對於其中有真的只有一個很好的解決方案,這裏由@Stefan給出的那些問題之一。儘管如此,嘗試去嘗試其他方式也很有趣,也很有教育意義。下面是一個遞歸的方法:

arr = [["red", "green", "blue"], 
     ["small", "large", "medium"], 
     ["loose", "tight"]] 

def combo(arr) 
    return arr.first.product(arr.last) if arr.size == 2 
    combo(arr[1..-1]).flat_map { |c| arr.first.map { |f| [f, *c] } } 
end 

combo(arr) 
    #=> [["red", "small", "loose"], ["green", "small", "loose"], 
    # ["blue", "small", "loose"], ["red", "small", "tight"], 
    # ["green", "small", "tight"], ["blue", "small", "tight"], 
    # ["red", "large", "loose"], ["green", "large", "loose"], 
    # ... 
    # ["green", "medium", "tight"], ["blue", "medium", "tight"]] 

我假定返回的數組中元素的順序並不重要。