どうすればこの配列を変換できますか?変換する方法Rubyの配列
test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5']
フォーマットが必要です。
first_array = ['1', '2', '3']
second_array = ['4' '5']
どうすればこの配列を変換できますか?変換する方法Rubyの配列
test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5']
フォーマットが必要です。
first_array = ['1', '2', '3']
second_array = ['4' '5']
あなたが必要なのは、このようなsliceを使用して行うことができる2つの部分に配列を分割する場合:あなたが撮影した名前の変数を作成するために探している場合
test = ['first_array', '1', '2', '3', 'second_array', '4', '5']
first_array = test.slice(1, 3)
second_array = test.slice(5, 2)
配列(例:first_array
、second_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"]]
としては、この中で説明しました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"] }
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"]
を使用でき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"]]
**あなたが要件出てクリアすることができ、より正確には?**大きなセットから、この一つの特定の配列やその種類や例はありますか?それは常に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の場合に適しています –