如何从许多数组中创建哈希?

时间:2018-03-29 20:21:15

标签: ruby

我有一个如下所示的数组:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]

如何将其转换为类似于此的哈希:

{1=>[6, 11], 2=>[7, 12], 3=>[8, 13], 4=>[9, 14], 5=>[10, 15]]

任何帮助将不胜感激!试图在Ruby中做到这一点。

5 个答案:

答案 0 :(得分:7)

foo = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
foo.transpose.map { |x, *y| [x, y] }.to_h

答案 1 :(得分:5)

这是映射事物的一种非常奇怪的方式,但是使用聪明的方法签名并不太难:

public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_view,parent,false);
    return new CustomViewHolder(view) ;
}

然后你用splat调用它:

def pivot(keys, *values)
  keys.each_with_index.map do |key, i|
    [ key, values.map { |v| v[i] } ]
  end.to_h
end

答案 2 :(得分:2)

我有点像zip

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
a[0].zip(a[1].zip(a[2])).to_h

缺点是它有三个子阵列的硬连线。

这可以用splat推广,所以

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
a[0].zip(a[1].zip(*a.drop(2))).to_h

产量

{1=>[6, 11, 16], 2=>[7, 12, 17], 3=>[8, 13, 18], 4=>[9, 14, 19], 5=>[10, 15, 20]}

无需任何额外的压缩级别。

答案 3 :(得分:1)

假设您的数组存储在变量名array下,我会这样做:

hash = {}

array[0].each.with_index do |value, i|
  hash[value] = [array[1][i], array[2][i]]
end

答案 4 :(得分:1)

pjs和ndn的答案的混合物:

arr.first.zip(arr[1..-1].transpose).to_h

在评论中也非常相似(由CarySwoveland发布):

arr.first.zip(arr.drop(1).transpose).to_h