I had a similar situation, but the hashes had keys. I used the sorting method.
What I mean:
you have an array:
[{:x=>1},{:x=>2},{:x=>3},{:x=>2},{:x=>1}]
you sort it ( #sort_by {|t| t[:x]} ) and get the following:
[{:x=>1}, {:x=>1}, {:x=>2}, {:x=>2}, {:x=>3}]
now a slightly modified version of Aaron Hinny's answer:
your_array.inject([]) do |result,item| result << item if !result.last||result.last[:x]!=item[:x] result end
I also tried:
test.inject([]) {|r,h| r<<h unless r.find {|t| t[:x]==h[:x]}; r}.sort_by {|t| t[:x]}
but he is very slow. here is my guideline:
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
results:
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)
naquad May 7 '09 at 1:18 p.m. 2009-05-07 13:18
source share