我怎樣才能轉換這個數組?如何使變換紅寶石陣列
test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5']
需要的格式。
first_array = ['1', '2', '3']
second_array = ['4' '5']
我怎樣才能轉換這個數組?如何使變換紅寶石陣列
test = [ 'first_array', '1', '2', '3', 'second_array', '4', '5']
需要的格式。
first_array = ['1', '2', '3']
second_array = ['4' '5']
如果你需要的是陣列分成兩個部分,可以做到用一個slice這樣的:
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中動態創建變量。
要做到這一點,你可以使用chunk_while
與with_object
一起,例如:
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,第二個數組一個單詞後面跟着另一個帶有下劃線的單詞?那麼十萬五十四碼呢?格式是什麼?數組中是否可以有另一個單詞:[first_array,1,2,3,second_array,4,5,6,hello,9,8,you,11,are,cool,13,10,&,1271872]?如果您可以添加一些關於需求和測試用例的描述,那麼對於所有測試用例來說都會更清楚。這對測試驅動的p來說是個好例子 –