From: Robert Klemme Date: 2004-12-14T05:37:18+09:00 Subject: Re: [Nuby] Sorting a Hash and keepint it as a Hash? > > "Williams, Chris" schrieb im Newsbeitrag > news:A0AC2703C633EB48B5DFEF66D6EBF7120E49DD@wcxlms02.wcrt.xeroxlabs.com... > Another nuby question: > > I have a Hash of objects which I want to sort by the values. Afterwards > I want to pull out the keys as one array and the values as another. So I > have code like so: You want sort with a block: >> h={1=>"a",2=>"b"} => {1=>"a", 2=>"b"} >> h.sort {|(k1,v1),(k2,v2)| v1 <=> v2} => [[1, "a"], [2, "b"]] If you use inject you can get your two arrays in one go: >> h.sort {|(k1,v1),(k2,v2)| v1 <=> v2}.inject([[],[]]) {|(ks,vs),(k,v)| ks >> << k; vs << v; [ks,vs]} => [[1, 2], ["a", "b"]] >> keys, values = h.sort {|(k1,v1),(k2,v2)| v1 <=> v2}.inject([[],[]]) >> {|(ks,vs),(k,v)| ks << k; vs << v; [ks,vs]} => [[1, 2], ["a", "b"]] >> keys => [1, 2] >> values => ["a", "b"] > # sort by frequency ascending > @fault_sums = @fault_sums.sort {|a,b| a[1] <=> b[1]} > # Only keep top N > @fault_sums.slice!(0...-@number) if @number <= @fault_sums.size > > fields = @fault_sums.keys > data = @fault_sums.values > > But when I get to calling keys and values on the Hash I realized, sort > actually returns back a 2D array and those methods aren't defined on an > Array. Is there a way to make the 2D Array returned by the sort back > into a Hash? This won't help as the hash you get then is unsorted again. If you need a copy, Hash#dup or Marshal.load(Marshal.dump(hash)) is a better choice. Kind regards robert