2013-02-05 89 views
-1

Possible Duplicate:
ruby - Permutation between elements of an array紅寶石 - 在一個陣列

我編碼在谷歌SketchUp中紅寶石插件和我面對,而試圖在置換是存在的另一個陣列的陣列的不同元件的一個現實問題不同元素之間的置換,所有這些取決於用戶組合。

我有陣列狀的陣列:

[["a, "b", c"], ["lol1", "lol2", lol3"], ["so1", "so2", "so3"]] 

對於像的組合:

[1, 2, 3] 

輸出應該仍然相同:

[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]] 

但是,對於像的組合:

[2, 1, 3] 

輸出應該是:

[["b", "a", "c"], ["lol2", "lol1", "lol3"], ["so2", "so1", "so3"]] 

但對於像組合:

[3, 2, 1] 

輸出應該是:

[["c", "b", a"], ["lol3", "lol2", "lol1"], ["so3", "so2", "so1"]] 
+1

呃......是我還是... – ByScripts

+1

您使用的是哪個版本的Ruby?你寫了什麼代碼? –

+1

@Mehdi Kamar,這個數組並不包含你認爲它的作用。它是一個數組數組,但每個子數組只包含一個字符串。 – steenslag

回答

2
ar = [["a, b, c"], ["lol1, lol2, lol3"], ["so1, so2, so3"]] 
p maybe_this = ar.map{|sub_ar| sub_ar.first.split(', ')} 
#[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]] 
idx = [2,1,3] 
#indexing of an array is zero-based 
p idx.map!{|i| i-1} #[1,0,2] 
p res = maybe_this.map{|sub_ar| sub_ar.values_at(*idx)} 
#[["b", "a", "c"], ["lol2", "lol1", "lol3"], ["so2", "so1", "so3"]] 

小故事:values_at方法有多個參數; *idx將數組轉換爲多個參數。

+0

謝謝你救了我的命! 我想知道如果我有一個數組包含零像'[0,2,1]'? –

+0

然後不要做'idx.​​map!{| i | i-1}'。你必須使用的所有輸入都是(有)笨拙的格式。 [0,2,1]很好,不需要重新加工。 – steenslag

1

也許你想這樣的:

perm_idx = [1,2,3].permutation.to_a.index([2,3,1]) 
[["a", "b", "c"], ["lol1", "lol2", "lol3"], ["so1", "so2", "so3"]].map {|x| x.permutation.to_a[perm_idx] } 
+0

NoMethodError:[1,2,3]未定義的方法'排列':Array –

+0

@MehdiKamar我想你使用的是Ruby 1.8?這個問題可能有所幫助:http://stackoverflow.com/questions/1150359/ruby-1-9-methods-in-ruby-1-8-6 –

+0

是的,我使用紅寶石1.8.6。我要檢查你的提議。 –

0

不清楚自己想要什麼,但是這可能會爲你工作:

a = [["a, b, c"], ["lol1, lol2, lol3"], ["so1, so2, so3"]] 

def combi_with_join(ordering, arrays) 
    ordering = ordering.map {|x| x - 1} 
    arrays.map {|ar| [ar.first.split(/,\s*/).values_at(*ordering).join(", ")] } 
end 

puts combi_with_join([1, 2, 3], a).inspect 
puts combi_with_join([2, 1, 3], a).inspect 
puts combi_with_join([3, 2, 1], a).inspect 

,如果你真的想要一個數組的數組...

def combi(ordering, arrays) 
    ordering = ordering.map {|x| x - 1} 
    arrays.map {|ar| ar.first.split(/,\s*/).values_at(*ordering) } 
end 

puts combi([1, 2, 3], a).inspect 
puts combi([2, 1, 3], a).inspect 
puts combi([3, 2, 1], a).inspect