2013-09-28 21 views
2

排序散列的数组我有哈希值的一个数组如下:在Ruby中

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

我想解决这阵基础上的关键"k2"哈希。我想按照降序排列,总是排在前"-NA-"

我要排序的数组是这样的:

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

我试过hash.sort_by方法,却得到了不正确的结果。如何在Ruby中做到这一点?

+0

从你写的是什么,它听起来就像你想把它们作为排序字符串。例如,''5%''会在降序“75%”之后和“15%”之前出现。它是否正确? – sawa

+0

不可以。我想仅将它们排序为数字。所以,顺序是:75,然后是15,但是NA应该始终位于顶端。 – user2823083

+1

我明白了。那么这个问题就不好说了。讲清楚。 – sawa

回答

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

na, rest = a.partition{|h| h["k2"] == "-NA-"} 
na + rest.sort_by{|h| h["k2"].to_f}.reverse 
# => 
[ 
    { 
    "k1" => "v2", 
    "k2" => "-NA-" 
    }, 
    { 
    "k1" => "v1", 
    "k2" => "75.1%" 
    }, 
    { 
    "k1" => "v3", 
    "k2" => "5.1%" 
    } 
] 
+1

非常棒的回答,sawa :)我没有意识到分区方法。 – user2823083

+0

'“5.4&* $#%&+()”。to_f' => 5.4。每天学习新的东西...... –

+0

我的歉意。不知何故,当我打算升职时,我就低调了。我投了票之前是+2。 –

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%"}] 

降序排列彩车的排序可以通过订购他们为自己的底片来完成。 该块将把"-NA-"视为最负数:minus Float :: INFINITY;所有其他字符串都按照它们的负浮动表示的顺序排列,使用三元运算符(简写为if then else)。

+0

有趣的答案。你能解释一下吗? – AGS

+1

@AGS增加了一些解释。 – steenslag

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 }