【问题标题】:Select Hash Value when Key is an ArrayKey为数组时选择Hash值
【发布时间】:2012-09-06 14:48:32
【问题描述】:

我有一个散列,其中包含一些键作为数组,如下所示:

foo = {[45, 121]=>:some_field}

如何选择 :some_field 其中 foo 键包含 45?

其次,如果找到匹配项,我如何检索同一键中的其他元素?

【问题讨论】:

  • 你的哈希值奇怪地倒退了。通常:some_field 将是键,而值将是一个数组,您可以将附加数字附加到该数组中。我不能肯定地说你没有正确使用它,因为绝对没有上下文,但是 array=>symbol 哈希通常不如 symbol=>array 有用。
  • 哈希是如何构造的?你能改变它以提高查找效率吗?

标签: ruby


【解决方案1】:

虽然您可以这样做,但这有点违背了使用哈希的目的,因为您必须对整个事物进行线性扫描。为同一个值设置多个哈希键会更好,因为您可以使用哈希作为索引。

例子:

found = foo.find { |k, v| k.include?(n) }
found and found[1]

请记住,如果您在密钥中有大量条目并且在哈希中有大量项目,则此操作的性能将是糟糕的,因为它必须针对所有密钥和所有单独的值。

【讨论】:

  • 实际上,我可以重新处理 foo 以便 45 和 121 是唯一键,我只需将 :some_field 复制到每个键。我该怎么做?
【解决方案2】:
foo = {[45, 121]=>:some_field}
foo.detect{ |k,v| k.include? 45 }
#=> [[45, 121], :some_field]
foo.detect{ |k,v| k.include? 45 }.last
#=> :some_field

【讨论】:

  • 虽然这行得通,但它与遍历数组寻找结果一样糟糕。
【解决方案3】:

如果它不仅仅是一个元素,我建议你反转你的哈希:

foo = {[45, 121]=>:some_field, [1, 45, 7] => :some_other_field}

bar = {}
foo.each do |k, v|
  k.each do |x|
    if bar.has_key?(x)
      bar[x] << [[k, v]]
    else
      bar[x] = [[k, v]]
    end
  end
end

p bar[45]

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2020-11-28
    • 2019-12-20
    • 1970-01-01
    • 2012-03-22
    • 2015-08-27
    • 2017-06-07
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多