2017-07-21 10 views
4

他の配列で定義されているXの出現数が値になるように100の大きさの配列を作成したいとします。Ruby - 出現の集合を掛けて配列を作成する

ので、以下の配列:

arr1 = ['text1', 'text2', 'text3', 'text4', 'text5', 'text6'] 
arr2 = [5, 5, 10, 10, 20, 50] 

は5倍の値'text1'、50倍の値'text6'を含む新しい配列を作成します、など

+0

あなたは、文字列または1つのフラット配列を含むサブアレイをしたいですか? – dawg

答えて

7

この1

arr1.zip(arr2).flat_map { |s, n| Array.new(n) { s } } 
をお試しください

まず、各文字列をその整数でペアにし、これらのペアを繰り返し処理し、n回の文字列sの配列を作成します。単純なmapの代わりにflat_mapを使用すると、そのトリックには多次元配列がありません。あなたは

+0

2つの配列が同じサイズのときに 'zip'と' transpose'の等価性を指摘すると、これは '[arr1、arr2] .transpose.flat_map ....'と書くことができます。 –

+0

ありがとう@CarySwoveland^_^ – Ursus

+0

OPが望むものによって、 'Array.new(n){s}'が望ましいかもしれません。 –

6

を行うことができます。サブアレイ[[s,s,s..],[s2,s2,s2...]]を持つ配列を生成します

arr1.zip(arr2).map {|s,x| [s]*x} 

。あなたは、各文字列は別々のサブアレイにしたくない場合は、次の

[arr1, arr2].transpose.flat_map { |s,x| [s] * x } 
+0

更新しました。あるいは、 'map'と' flatten'ではなく 'flat_map'を更新しました。 –

+2

さらに、@ muistooshortのところでは、 'flat_map'が' flatten'よりも望ましいと思うなら(私はそう思っています)、 'flatten'行を削除してみませんか? 「誰が何を示唆したか」は無関係です。あなたができる最高の答えを与えるだけでなく、他人が作る価値のある提案を組み込むことができます。 –

2

アレイ#サイクル:

arr1.zip(arr2).flat_map {|s,x| [s]*x} 

としては、あなたが行うことができますので、ziptransposeが等価であるコメントで指摘しました

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 
関連する問題