当前位置:  开发笔记 > 后端 > 正文

如何从Ruby中的哈希数组中获取唯一元素?

如何解决《如何从Ruby中的哈希数组中获取唯一元素?》经验,为你挑选了3个好方法。

我有一个哈希数组,我想要它的唯一值.打电话Array.uniq给我的不是我的期望.

a = [{:a => 1},{:a => 2}, {:a => 1}]
a.uniq # => [{:a => 1}, {:a => 2}, {:a => 1}]

我期望的地方:

[{:a => 1}, {:a => 2}]

在网上搜索时,我没有想出一个我满意的解决方案.乡亲们建议重新界定Hash.eql?Hash.hash,因为这是Array.uniq被查询.

编辑:在现实世界中遇到这个问题时,哈希值稍微复杂一些.它们是解析的JSON的结果,它具有多个字段,其中一些值也是哈希值.我有一系列的结果,我想过滤掉唯一的值.

我不喜欢重新定义Hash.eql?Hash.hash解决方案,因为我要么Hash全局重新定义,要么为我的数组中的每个条目重新定义它.更改Hash每个条目的定义会很麻烦,尤其是因为每个条目中可能存在嵌套的哈希值.

Hash全球变化有一定的潜力,特别是如果它是暂时完成的话.我想构建另一个类或辅助函数来包装保存旧的定义并恢复它们,但我认为这会增加实际需要的复杂性.

使用inject似乎是重新定义的一个很好的选择Hash.



1> Aaron Hinni..:

我可以通过电话得到我想要的东西 inject

a = [{:a => 1},{:a => 2}, {:a => 1}]
a.inject([]) { |result,h| result << h unless result.include?(h); result }

这将返回:

[{:a=>1}, {:a=>2}]



2> fl00r..:

Ruby 1.8.7+将返回您所期望的内容:

[{:a=>1}, {:a=>2}, {:a=>1}].uniq
#=> [{:a=>1}, {:a=>2}] 



3> 小智..:

我有类似的情况,但哈希有钥匙.我用的是排序方法.

我的意思是说:

你有一个数组:

[{:x=>1},{:x=>2},{:x=>3},{:x=>2},{:x=>1}]

你排序它(#sort_by {|t| t[:x]})并得到这个:

[{:x=>1}, {:x=>1}, {:x=>2}, {:x=>2}, {:x=>3}]

现在是Aaaron Hinni的一个修改版本的答案:

your_array.inject([]) do |result,item| 
  result << item if !result.last||result.last[:x]!=item[:x]
  result
end

我也尝试过:

test.inject([]) {|r,h| r<

但它很慢.这是我的基准:

test=[]
1000.times {test<<{:x=>rand}}

Benchmark.bmbm do |bm|
  bm.report("sorting: ") do
    test.sort_by {|t| t[:x]}.inject([]) {|r,h| r<

结果:

Rehearsal ---------------------------------------------
sorting:    0.010000   0.000000   0.010000 (  0.005633)
inject:     0.470000   0.140000   0.610000 (  0.621973)
------------------------------------ total: 0.620000sec

                user     system      total        real
sorting:    0.010000   0.000000   0.010000 (  0.003839)
inject:     0.480000   0.130000   0.610000 (  0.612438)

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有