我有兩個數組結合陣列,而不產品的方法
a = [1,2,3,4]
b = [a,b,c,d,e,f]
,我需要結合起來,創造:
c = [[1,a],[1,b],[1,c],[1,d],[1,e],[1,f],[2,a],[2,b],...]
我會1.9或更高版本使用product
方法使用Ruby版本,但我運行舊版本的Ruby,並且此方法不存在。我不知道如何在不使用product
方法的情況下創建c
。可以提供任何建議嗎?
我有兩個數組結合陣列,而不產品的方法
a = [1,2,3,4]
b = [a,b,c,d,e,f]
,我需要結合起來,創造:
c = [[1,a],[1,b],[1,c],[1,d],[1,e],[1,f],[2,a],[2,b],...]
我會1.9或更高版本使用product
方法使用Ruby版本,但我運行舊版本的Ruby,並且此方法不存在。我不知道如何在不使用product
方法的情況下創建c
。可以提供任何建議嗎?
你正在做的是試圖獲得笛卡爾產品。
我創建了一個名爲CartesianArray
的類,該類繼承自Array
併爲您提供了一個#product
方法。
class CartesianArray < Array
def initialize(array_one, array_two)
@array_one, @array_two = array_one, array_two
end
def product
results = []
@array_one.each do |a1|
@array_two.each do { |a2| results << [a1, a2] }
end
results
end
end
你可以使用這樣的:
# Test Code
numbers = [1,2,3,4]
letters = ['a','b','c','d','e','f']
cart_array = CartesianArray.new(numbers, letters)
p cart_array.product
[[1, "a"], [1, "b"], [1, "c"], [1, "d"], [1, "e"], [1, "f"], [2, "a"], [2, "b"], [2, "c"], [2, "d"], [2, "e"], [2, "f"], [3, "a"], [3, "b"], [3, "c"], [3, "d"], [3, "e"], [3, "f"], [4, "a"], [4, "b"], [4, "c"], [4, "d"], [4, "e"], [4, "f"]]
如果你不喜歡保持它在這個類的話,我敢肯定,你可以只拉出#product
方法並對其進行修改以適應您的代碼。
核心部分很好,但我認爲將它放在Array的子類中並不合理。你沒有使用任何一個數組作爲接收器,也沒有將它用作類方法。 – sawa
@sawa我明白你在說什麼。我認爲steenslag的方法非常好。與產品的猴子修補陣列更接近從1.9開始將使用ryan1393402。另外,我認爲最終解決方案應該使用任意數量的數組而不是兩個。 –
a.map {|ma| b.map { |mb| [ma, mb]} }
這會導致過多的嵌套(與「產品」方法相比)。 – steenslag
此評論是正確的,我希望看到最準確地複製'product'方法的最有效方法。 – ryan1393402
當然也有更簡單,更有效的方式來做到這一點比 -
(a+b).combination(2).map {|c| c if a.include?(c.join.to_i)}.compact
但我喜歡,你可以用Ruby編寫不同的可能的一個襯墊。
c = a.map{|x| b.map{|y| [x,y]}}.flatten(1)
根據你的Ruby版本有多老,你可能需要使用:
c = a.map{|x| b.map{|y| [x,y]}}.inject([],:concat)
class Array
def product(other)
if block_given? then
each {|el| other.each {|other_el| yield [el, other_el]}}
else
res=[]
each{|el| other.each {|other_el| res << [el, other_el]}}
res
end
end
end
a = [1,2,3,4]
b = %w(a b c d e f)
p a.product(b) #[[1, "a"], [1, "b"], [1, "c"],...
a.product(b){|e| puts e.join}
#1a
#1b
#1c
#1d...
對於最近的Ruby版本會有這個代碼return to_enum unless block_given?
地方,但據我所知to_enum
不適用於舊款的紅寶石。真正的product
需要多個參數;我還沒有找到一種方法來做非遞歸的。
得到Array#product
老年紅寶石,最簡單的方法是使用backports gem。它增加了這種方法to Ruby 1.87和Ruby 1.9.2。
這是一個原始的雙循環,不是嗎? –
請不要混淆Ruby和Ruby on Rails,它們是兩個完全不同的東西,它們的名字比它們的共同點更爲共同。 –