Aar*_*nni 24 ruby arrays hash unique
我有一个哈希数组,我想要它的唯一值.打电话Array.uniq
给我的不是我的期望.
a = [{:a => 1},{:a => 2}, {:a => 1}]
a.uniq # => [{:a => 1}, {:a => 2}, {:a => 1}]
Run Code Online (Sandbox Code Playgroud)
我期望的地方:
[{:a => 1}, {:a => 2}]
Run Code Online (Sandbox Code Playgroud)
在网上搜索时,我没有想出一个我满意的解决方案.乡亲们建议重新界定Hash.eql?
和Hash.hash
,因为这是Array.uniq
被查询.
编辑:在现实世界中遇到这个问题时,哈希值稍微复杂一些.它们是解析的JSON的结果,它具有多个字段,其中一些值也是哈希值.我有一系列的结果,我想过滤掉唯一的值.
我不喜欢重新定义Hash.eql?
和Hash.hash
解决方案,因为我要么Hash
全局重新定义,要么为我的数组中的每个条目重新定义它.更改Hash
每个条目的定义会很麻烦,尤其是因为每个条目中可能存在嵌套的哈希值.
Hash
全球变化有一定的潜力,特别是如果它是暂时完成的话.我想构建另一个类或辅助函数来包装保存旧的定义并恢复它们,但我认为这会增加实际需要的复杂性.
使用inject
似乎是重新定义的一个很好的选择Hash
.
Aar*_*nni 27
我可以通过电话得到我想要的东西 inject
a = [{:a => 1},{:a => 2}, {:a => 1}]
a.inject([]) { |result,h| result << h unless result.include?(h); result }
Run Code Online (Sandbox Code Playgroud)
这将返回:
[{:a=>1}, {:a=>2}]
Run Code Online (Sandbox Code Playgroud)
fl0*_*00r 17
Ruby 1.8.7+将返回您所期望的内容:
[{:a=>1}, {:a=>2}, {:a=>1}].uniq
#=> [{:a=>1}, {:a=>2}]
Run Code Online (Sandbox Code Playgroud)
小智 5
我有类似的情况,但哈希有钥匙.我用的是排序方法.
我的意思是说:
你有一个数组:
[{:x=>1},{:x=>2},{:x=>3},{:x=>2},{:x=>1}]
Run Code Online (Sandbox Code Playgroud)
你排序它(#sort_by {|t| t[:x]}
)并得到这个:
[{:x=>1}, {:x=>1}, {:x=>2}, {:x=>2}, {:x=>3}]
Run Code Online (Sandbox Code Playgroud)
现在是Aaaron Hinni的一个修改版本的答案:
your_array.inject([]) do |result,item|
result << item if !result.last||result.last[:x]!=item[:x]
result
end
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
test.inject([]) {|r,h| r<<h unless r.find {|t| t[:x]==h[:x]}; r}.sort_by {|t| t[:x]}
Run Code Online (Sandbox Code Playgroud)
但它很慢.这是我的基准:
test=[]
1000.times {test<<{:x=>rand}}
Benchmark.bmbm do |bm|
bm.report("sorting: ") do
test.sort_by {|t| t[:x]}.inject([]) {|r,h| r<<h if !r.last||r.last[:x]!=h[:x]; r}
end
bm.report("inject: ") {test.inject([]) {|r,h| r<<h unless r.find {|t| t[:x]==h[:x]}; r}.sort_by {|t| t[:x]} }
end
Run Code Online (Sandbox Code Playgroud)
结果:
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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24611 次 |
最近记录: |