【问题标题】:Adding values to existing (Hash)key, without over-writing the existing value(s)?向现有(哈希)键添加值,而不覆盖现有值?
【发布时间】:2012-03-31 23:25:11
【问题描述】:

简化版:

ar=['name: Joe', 'name: Jack', 'name: Jill']

hash={}

ar.each{|line| if line.include?('name'); hash['name'] = line;end;}

puts hash

我的目标是将数组中的所有元素添加到“名称”键,但我的代码似乎覆盖了现有值。

是否可以将多个值分配给一个键?我宁愿不使用数组作为值。

编辑:

我意识到我的第一个示例并没有涵盖整个问题:

将数组扩展为: ar=['name: Joe', 'name: Jack', 'name: Jill', age: 29', 'age: 32', 'misc: Great weather']

我希望将“名称”分组在“名称”键下,依此类推。

属性/键的数量事先是未知的,因此数组将动态生成。

【问题讨论】:

  • 当您致电hash[name] 时,您期望得到什么结果?您希望返回某个特定名称,还是希望返回所有已添加的名称?
  • 我有点希望它们都作为单独的字符串。但似乎数组是要走的路。
  • 对您的编辑,然后您应该创建新问题

标签: ruby arrays hash


【解决方案1】:

除了使用数组作为值之外别无选择。否则你将如何检索多个值?无论如何,您都需要某种可枚举类型,因此使用数组没有问题。

试试这样的:

hash = {}
ar = ['name: Joe', 'name: Jack', 'name: Jill']

hash['name'] = ar.select {|l| l.include? 'name'}.collect {|l| l.split.last}

hash # => {"name"=>["Joe", "Jack", "Jill"]}

或者,更简单一点:

hash = {"name" => ar.select {|l| l.include? 'name'}.collect {|l| l.split.last} }

对于您编辑的问题:

hash = Hash.new {|h,k| h[k] = [] }
ar.each {|l| k,v = l.split(": "); hash[k] << v }
hash # => {"name"=>["Joe", "Jack", "Jill"], "foo"=>["bar"]}

【讨论】:

  • 我认为有一种方法可以将单独的变量存储在一个键下,无法真正解释原因,但我似乎有可能.. :s 谢谢。
  • 想一想在一个键下存储多个东西意味着什么,虽然......你仍然需要做类似for name in hash["name"]......这正是它的工作原理:)跨度>
  • 抱歉,我不知道如何将您的解决方案转移到我的(现在)扩展问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多