Ruby-Hash表的sort_by方法

经常会遇到hash表中元素比较的问题,mark一下。


如果我要比较这个Hash表中年龄的大小:

people = {
  :me => 23,
  :brother => 18,
  :sister => 25
}


直接用sort方法:

irb(main):025:0> people.sort
=> [[:brother, 18], [:me, 23], [:sister, 25]]

ruby比较智能,可能会知道我们要比较的Fixnum对象的大小。

而且sort方法对字符串类型的也能处理:

irb(main):037:0> ["3","1","2"].sort
=> ["1", "2", "3"]


但是,如果我们想指定Hash表中比较的元素,就要用到sort_by方法,比如要处理下面的复杂点的内嵌的hash表:

people = {
  :me => { :name => "hen", :age => 23 },
  :brother => { :name => "abb", :age => 18 },
  :sister => { :name => "ndd", :age => 25 }
}

我们可以这样写:

people.sort_by do |k,v|
  v[:age]
end
#=> [[:brother, {:name=>"abb", :age=>18}], [:me, {:name=>"hen", :age=>23}], [:sister, {:name=>"ndd", :age=>25}]]

sort_by提取出了两个元素k和v,k是第一层hash表的键(symbol对象),而v是第一层hash表的值(内嵌hash对象),这样v[:age]就代表着年龄值(Fixnum),块内需指明了要比较的对象,在这里是指的是Fixnum对象,还有其他String也可以,所以sort_by能正常工作。

简单验证下上面的说法:

people.sort_by do |k,v|
  print "#{k.class} #{v.class}\n"
end
# => Symbol Hash
# => Symbol Hash
# => Symbol Hash

回到之前的people对象,我们可以用sort_by这样写:

people = {
  :me => 23,
  :brother => 18,
  :sister => 25

people.sort_by do |k|
  k[1]
end
# => [[:brother, "18"], [:me, "23"], [:sister, "25"]]


在这里,sort_by提取出来的k是数组,所以k[1]就代表着年龄值。可以看出来,:me => 23 在hash内部是一个数组,数组第一个值是键,第二个是值。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值