2017-07-15 111 views
-2

我怎样才能转换这个数组?如何使变换红宝石阵列

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

需要的格式。

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

**你能明确了要求更精确?**是从一个更大的集这一个特定的阵列或它的类型或例子吗?它总是会像first_array,第二个数组一个单词后面跟着另一个带有下划线的单词?那么十万五十四码呢?格式是什么?数组中是否可以有另一个单词:[first_array,1,2,3,second_array,4,5,6,hello,9,8,you,11,are,cool,13,10,&,1271872]?如果您可以添加一些关于需求和测试用例的描述,那么对于所有测试用例来说都会更清楚。这对测试驱动的p来说是个好例子 –

回答

0

如果你需要的是阵列分成两个部分,可以做到用一个slice这样的:

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

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

如果您正在寻找创建从采取的名称的变量数组(例如first_array,second_array),那么您应该考虑使用散列,因为您无法在Ruby中动态创建变量。

要做到这一点,你可以使用chunk_whilewith_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"]] 
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"]]