0

我迭代地将元素分配给一个散列,其值是一个由整数和数组组成的数组。我当前策略的一个玩具示例是这样的(递增数组的第一个元素,并将一个数字推送到数组的第二个元素):

aHash = Hash.new([0, []])

[1,3,5,1,1].each do |x|
  aHash[x] = [aHash[x][0] + 1, aHash[x][1] << x]
end

aHash # => {1=>[3, [1, 3, 5, 1, 1]], 3=>[1, [1, 3, 5, 1, 1]], 5=>[1, [1, 3, 5, 1, 1]]}

循环的递增部分似乎正在工作,但附加每个数组却没有。所需的哈希应如下所示:

aHash # => {1=>[3, [1, 1, 1]], 3=>[1, [3]], 5=>[1, [5]]}

我也试过:

[1,3,5,1,1].each do |x|
  aHash[x] = [aHash.values_at(x)[0][0] + 1, aHash.values_at(x)[0][1] << x]
end

aHash # => {1=>[3, [1, 3, 5, 1, 1]], 3=>[1, [1, 3, 5, 1, 1]], 5=>[1, [1, 3, 5, 1, 1]]}

但是我得到了同样的错误结果。

话虽如此,我的问题是:

  1. 假设这是我的问题,或者,如果不是这样,我该如何正确初始化这个哈希......
  2. 正确增加哈希值的第一个元素,并附加哈希值的第二个元素?
4

2 回答 2

2
aHash = Hash.new([0, []])

在 Ruby 中,对象是通过引用传递的。您正在为默认值 ( ) 创建一个数组,并在每次访问缺少的键时[0, []]传递对同一数组的引用。

解决方案是在块内创建默认数组,以便使用每个缺失的键重新评估它:

aHash = Hash.new { [0, []] }
于 2013-10-18T20:31:55.527 回答
0

如果我试图获得您正在寻找的结果,我会使用 group_by 函数。

a = [1,3,5,1,1]
p a.group_by{|x|x} #=> {5=>[5], 1=>[1, 1, 1], 3=>[3]}

如果你真的想要你要求的格式:

a = [1,3,5,1,1]
a_transformed = a.group_by{|x|x}.map{|x|[x.first,[x.last.size,x.last]]}
p Hash[a_transformed] #=> {1=>[3, [1, 1, 1]], 3=>[1, [3]], 5=>[1, [5]]}
于 2013-10-18T21:33:16.903 回答