Ruby-Hash表的sort_by方法
2015-11-19 20:28
351 查看
经常会遇到hash表中元素比较的问题,mark一下。
如果我要比较这个Hash表中年龄的大小:
直接用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内部是一个数组,数组第一个值是键,第二个是值。
如果我要比较这个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内部是一个数组,数组第一个值是键,第二个是值。
相关文章推荐
- ubuntu上安装配置Ruby on Rails
- cocoapods sources
- Ruby-Module初探
- 微型Web框架(Ruby) Sinatra
- 配置ruby环境
- Ruby在cmd下中文显示乱码以及不支持OpenSSL的问题解决
- 学习笔记 - 关于Ruby
- Xcode集成POD的过程及问题解决
- 提升你代码质量的10个Ruby小技巧
- 在源码阶段写出更快Ruby的秘诀
- Perl、PHP、Python、Java和Ruby的比较
- Ruby on rails基本框架搭建
- ruby环境sass编译中文出现Syntax error: Invalid GBK character错误解决方法
- Ruby/Java - 两种语言的二叉排序树的实现和遍历
- RubyMotion
- 用数据阐述Java, Python, Ruby, PHP, C等各语言性能对比
- 关于RubyMine使用的一个问题
- CocoaPod的安装及使用详细教程
- 更换ruby源----RubyGems 镜像 - 淘宝网
- rvm实现一个系统同时运行多个ruby版本项目(用于解决一个服务器部署多个ruby版本项目的实现)