これつぐです。 [ruby-list:17234] Re: stable sort > わたなべです. > > nobu.nakada / nifty.ne.jp <nobu.nakada / nifty.ne.jp> writes: > > :At Tue, 28 Sep 1999 17:39:26 +0900, > :OHARA Shigeki <os / iij.ad.jp> wrote: > :> ary0 = [ > :> { 'name' => 'angie', 'age' => '20' }, > :> { 'name' => 'charlie', 'age' => '19' }, > :> { 'name' => 'bob', 'age' => '20' }, > :> ] --中略-- > module Keyssort > def keyssort!(*keys) > filter{|e| [e.indexes(*keys), e]}.sort!.filter{|e| e.pop} > end > def keyssort(*keys) > dup.keyssort!(*keys) > end > end > > ary0.extend Keyssort > ary0.keyssort!('age', 'name') > p ary0 前にちらっと書きましたが、 これだと ary0.keysort!('age') で死にます。 e.indexes(*keys) が一致すると e で比較しようとするわけですが、 今は e が hash なので比較できない(<=> がない)からです。 あまり変えずに回避するには - filter{|e| [e.indexes(*keys), e]}.sort!.filter{|e| e.pop} + filter{|e| [e.indexes(*keys), self.index(e), e]}.sort!.filter{|e| e.pop} とかでしょうか? self.index(e) はちょっとまずいかもしれないので、 each_with_index を使って二行にするとか。 + each_with_index{|e, i| self[i]=e.indexes(*keys).push(i, e)} + sort!.filter{|e| e.pop}