2017-07-15 18 views
-2

どうすればこの配列を変換できますか?変換する方法Rubyの配列

test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5'] 

フォーマットが必要です。

first_array = ['1', '2', '3'] 
second_array = ['4' '5'] 
+0

**あなたが要件出てクリアすることができ、より正確には?**大きなセットから、この一つの特定の配列やその種類や例はありますか?それは常にfirst_arrayのようになりますか?2番目の配列の後ろにアンダースコアを付けた別の単語が続きますか? onethousandwentyfourtharrayはどうですか?どのような形式ですか?配列内に[first_array、1,2,3、second_array、4,5,6、hello、9,8、you、11、are、cool、13,10、&、1271872]という別の単語がありますか?要件とテストケースの説明を追加できる場合は、すべてのテストケースについて答えることがより明確になります。これは、テスト駆動型のpの場合に適しています –

答えて

0

あなたが必要なのは、このようなsliceを使用して行うことができる2つの部分に配列を分割する場合:あなたが撮影した名前の変数を作成するために探している場合

test = ['first_array', '1', '2', '3', 'second_array', '4', '5'] 

first_array = test.slice(1, 3) 
second_array = test.slice(5, 2) 
0

配列(例:first_arraysecond_array)の場合、Rubyで動的に変数を作成することはできないため、ハッシュを使用することを検討する必要があります。

これを実現するには、例えば、with_objectとともにchunk_whileを使用することができます。

test.chunk_while { |_, a| a =~ /^\d+$/ }.with_object({}) { |t, h| h[t.shift] = t } 
#=> {"first_array"=>["1", "2", "3"], "second_array"=>["4", "5"]} 

あなたが名前を気にし、異なる変数に値を手動で割り当てたくない場合は、することができますmapの代わりwith_objectを使用して、変数に直接割り当てる:最後の要素は数字であり、唯一の二つのグループが提供されている場合にのみ動作することを

first_array, second_array = test.chunk_while { |_, a| a =~ /^\d+$/ }.map { |t| t[1..-1] } 

first_array 
#=> ["1", "2", "3"] 

second_array 
# => ["4", "5"] 

注意を、それ以外の場合は、最初の配列で提供されるすべてのグループを返しますので、あなただけの配列の配列を一つの変数を作成し、または、いっその各グループの変数を作成枯れする必要があります。

test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5', 'third_array', '7', '8', '9', '10'] 
arrays = test.chunk_while { |_, a| a =~ /^\d+$/ }.map { |t| t[1..-1] } 

arrays 
#=> [["1", "2", "3"], ["4", "5"], ["7", "8", "9", "10"]] 
0

としては、この中で説明しましたanswer、あなたはRubyでローカル変数を動的に作成することはできないので、多分ハッシュを使うだけかもしれません。

test.chunk_while { |a,b| a[/\d/] && b[/\d/] } 
    .each_slice(2) 
    .map { |k,v| [*k, v] } 
    .to_h 

#=> { "first_array" => ["1", "2", "3"], "second_array" => ["4", "5"] } 
0

Rubyバージョン1.9+では、ローカル変数を作成できません。代わりに(@ sagarpandya82で提案されているように)、ハッシュを作成することです。それは次のようにして行うことができます。

def split_em(arr) 
    arr.each_with_object([]) { |o,a| o =~ /\d+/ ? (a.last << o) : a << o << [] } 
end 

a = split_em(test) 
    #=> ["first_array", ["1", "2", "3"], "second_array", ["4", "5"]] 
Hash[*a] 
    #=> {"first_array"=>["1", "2", "3"], "second_array"=>["4", "5"]} 

代わりに、インスタンス変数を作成することもできます。

class Test 
    def initialize(*arr) 
    split_em(arr).each_slice(2) { |k,v| instance_variable_set("@#{k}", v) } 
    end 
    end 
end 

t = Test.new(*test) 
    #=> #<Test:0x00000000bcc938 @first_array=["1", "2", "3"], @second_array=["4", "5"]> 
t.instance_variables.each { |v| puts "#{v} = #{t.instance_variable_get(v)}" } 
@first_array = ["1", "2", "3"] 
@second_array = ["4", "5"] 
0

を使用できEnumerable#slice_before

test = ['first_array', '1', '2', '3', 'second_array', '4', '5'] 

test.slice_before {|e| e.include?("_")}.map {|_,*arr| arr } 
#=> [["1", "2", "3"], ["4", "5"]] 
関連する問題