-1

重複の可能性:
ruby​​ - 配列の要素間の順列

Ruby を使用して Google 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"]]
4

3 に答える 3

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配列を複数の引数に分割します。

于 2013-02-05T22:58:39.770 に答える
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] }
于 2013-02-05T22:40:44.333 に答える
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
于 2013-02-05T23:15:26.497 に答える