1

如何将输入推入哈希值?我的问题是我有多个键,它们都引用数组。

{"A"=>["C"], "B"=>["E"], "C"=>["D"], "D"=>["B"]}

我怎样才能将另一个字符串推到其中一个上?例如,我想将 a 添加"Z"到 key 的数组中"A"

目前我要么覆盖以前的数组,要么所有数据都在一个中。

它关于将 Array["AB3", "DC2", "FG4", "AC1", "AF4"]转换为带有{"A"=>["B", "C", "F"]}.

4

3 回答 3

1

任何命令<<, push, unshift都会起作用

if h["A"] 
  h["A"] << "Z"
else
  h["A"] = ["Z"]
end
于 2012-06-09T16:00:30.637 回答
0

您说您最初的问题是将数组["AB3", "DC2", "FG4", "AC1", "AF4"]转换为 hash {"A"=>["B", "C", "F"]},可以这样完成:

Hash[a.group_by { |s| s[0] }.map { |k, v| [k, v.map { |s| s[1] }] }]

或者像这样:

a.inject(Hash.new{|h, k| h[k]=[]}) { |h, s| h[s[0]] << s[1] ; h }

请注意,这Hash.new{|h, k| h[k]=[]}会创建一个默认值为[](一个空数组)的数组,因此您始终可以使用<<它向其中添加元素。

于 2012-06-09T16:27:11.870 回答
0

更好的方法:

在 Hash 中添加一个新的类方法,如下所示:

class Hash
  def add (k,v)
    unless self.key?k
      self[k] = [v] 
    else
      self[k] = self[k] << v
    end 
    self
  end 
end


h={}
h.add('A','B') #=> {"A"=>["B"]}
h.add('A','C') #=> {"A"=>["B", "C"]}
h.add('B','X') #=> {"A"=>["B", "C"], "B"=>["X"]}

完毕。

根据您的确切问题,这可能更加惯用;比如说,您想一次发送多个值,然后可以对代码进行 DRY 处理以处理多个参数。

希望这可以帮助。

一切顺利。

于 2012-06-09T17:54:19.743 回答