他の配列で定義されているXの出現数が値になるように100の大きさの配列を作成したいとします。Ruby - 出現の集合を掛けて配列を作成する
ので、以下の配列:
arr1 = ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']
arr2 = [5, 5, 10, 10, 20, 50]
は5倍の値'text1'
、50倍の値'text6'
を含む新しい配列を作成します、など
他の配列で定義されているXの出現数が値になるように100の大きさの配列を作成したいとします。Ruby - 出現の集合を掛けて配列を作成する
ので、以下の配列:
arr1 = ['text1', 'text2', 'text3', 'text4', 'text5', 'text6']
arr2 = [5, 5, 10, 10, 20, 50]
は5倍の値'text1'
、50倍の値'text6'
を含む新しい配列を作成します、など
この1
arr1.zip(arr2).flat_map { |s, n| Array.new(n) { s } }
をお試しください
まず、各文字列をその整数でペアにし、これらのペアを繰り返し処理し、n回の文字列sの配列を作成します。単純なmap
の代わりにflat_map
を使用すると、そのトリックには多次元配列がありません。あなたは
2つの配列が同じサイズのときに 'zip'と' transpose'の等価性を指摘すると、これは '[arr1、arr2] .transpose.flat_map ....'と書くことができます。 –
ありがとう@CarySwoveland^_^ – Ursus
OPが望むものによって、 'Array.new(n){s}'が望ましいかもしれません。 –
を行うことができます。サブアレイ[[s,s,s..],[s2,s2,s2...]]
を持つ配列を生成します
arr1.zip(arr2).map {|s,x| [s]*x}
。あなたは、各文字列は別々のサブアレイにしたくない場合は、次の
[arr1, arr2].transpose.flat_map { |s,x| [s] * x }
更新しました。あるいは、 'map'と' flatten'ではなく 'flat_map'を更新しました。 –
さらに、@ muistooshortのところでは、 'flat_map'が' flatten'よりも望ましいと思うなら(私はそう思っています)、 'flatten'行を削除してみませんか? 「誰が何を示唆したか」は無関係です。あなたができる最高の答えを与えるだけでなく、他人が作る価値のある提案を組み込むことができます。 –
アレイ#サイクル:
arr1.zip(arr2).flat_map {|s,x| [s]*x}
としては、あなたが行うことができますので、zip
とtranspose
が等価であるコメントで指摘しました
arr1.flat_map.with_index { |s,i| [s].cycle.take arr2[i] }
アレイ#は
を埋めますarr2.flat_map.with_index { |n,i| [].fill arr1[i], 0...n }
アレイ#*
arr1.flat_map.with_index { |s,i| [s] * arr2[i] }
アレイ#挿入
arr1.map.with_index { |s,i| [].insert 0, [s] * arr2[i] }.flatten
あなたは、文字列または1つのフラット配列を含むサブアレイをしたいですか? – dawg