2

次のようなハッシュの配列が1つあります。

[{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}]

keyのに基づいて、このハッシュの配列をソートしたいと思います"k2""-NA-"常に上に来るように降順で並べ替えたいです。

次のように並べ替えられた配列が必要です。

[{"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v3", "k2"=>"5.1%"}]

hash.sort_by メソッドを試しましたが、間違った結果が得られました。Rubyでそれを行う方法は?

4

3 に答える 3

1

これは別の(一般的に使用される)アプローチです(a@sawaから):

NA = "-NA-"
K2 = "k2" 
a.sort {|a,b| a[K2]==NA ? -1 : b[K2]==NA ? 1 : -a[K2].to_f <=> -b[K2].to_f }
于 2013-09-28T20:59:30.037 に答える
1
ar = [{"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v3", "k2"=>"5.1%"}]
ar.sort_by{|h|(k2 = h["k2"]) == "-NA-"? -Float::INFINITY : -k2.to_f}
#=>[{"k1"=>"v2", "k2"=>"-NA-"}, {"k1"=>"v1", "k2"=>"75.1%"}, {"k1"=>"v3", "k2"=>"5.1%"}]

float を降順でソートするには、float をネガとして並べ替えます。"-NA-"ブロックは最も負の数として扱われます: マイナス Float::INFINITY; 他のすべての文字列は、三項演算子 ( の短縮形) を使用して、負の float 表現と同じように並べ替えられif then elseます。

于 2013-09-28T14:09:05.320 に答える