一个ruby数组问题!

Sma*_*olf 0 ruby

嘿,伙计们,我有一个问题.我想转换数组.[[1, [-1, 1]], [1, [20, 8]], [1, [30, 4]], [1, [40, 2]], [1, [41, 6]], [1, [70, 243]]] 进入这种风格[1,[[-1,1],[20,8],[30,4]...]或哈希[1 => ...]我怎么能做到这一点?谢谢 !

Mat*_*t S 6

Dict方法:

array = [your array]
dict = {}
array.each{ |a| (dict[a[0]] ||= []) << a[1] }
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,查克的建议将带来:

array = [your array]
dict = Hash.new {|h,k| h[k] = []}
array.each{ |a| dict[a[0]] << a[1] }
Run Code Online (Sandbox Code Playgroud)

然后,您可以按照您想要的样式从中获取数组:

new_arr = dict.select{|k,v| [k, v]}
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

[[1, [[-1, 1], [20, 8], [30, 4], [40, 2], [41, 6], [70, 243]]]]
Run Code Online (Sandbox Code Playgroud)

注意额外的数组,因为如果你有2开头的数组,你最后会有另一个数组.所以new_arr[0]会给你最初寻找的阵列.

  • 您也可以通过这种方式轻松地获得等效的数组.创建哈希,然后执行`hash.map {| key,values | [关键,价值观]}`.此外,您可以通过将哈希创建为"Hash.new {[]}"来大大简化您的`each` - 然后您不需要在每次迭代时使用`|| = []`,因为不存在的键将返回一个空数组. (3认同)