- 浏览: 1400544 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
1创建一个hash
就想创建一个数组一样,我们能够使用Hash的[]方法来创建一个hash:
相似的,我们还可以使用new来创建一个hash:
2指定一个默认值给hash
一个hash,如果你使用一个不存在的key去取值的话,将会返回给你一个nil,这里我们还可以自己定义默认值,从而来代替nil,或者我们还可以使用default=方法来改变它的默认值:
如果当一个key不存在时,你想抛出一个异常来代替返回默认值的话,你可以使用fetch方法,当你使用fetch 方法的时候如果key不存在,它则会抛出一个IndexError异常,它还有第二个参数,这个参数就是当你key不存在的时候所返回的值:
3存取或者加一个键值对
hash也有像数组一样的[]和[]=方法,还有一个store,它是[]=方法的别名:
在这里要注意,nil对象也可以作为一个健或者值:
4删除一个键值对
删除的话我们能够使用 clear, delete, delete_if, reject, reject!, 和shift 这些方法都能做到。
clear 将会把一个hash清空.
shift则将会删除掉最前面的一个键值对:
delete删除一个指定位置的键值对,如果不存在这个位置,则将会返回block里的字符串:
5迭代一个hash
我们能够使用each方法来做这个,它还有each_key, each_pair和 each_value方法,其中each_pair是each方法的别名:
each_key 和each_value的block只有一个参数:
6转置一个hash
也就是将一个hash的键和值交换:
注意这里有一个问题,那就是值有可能是重复的,这时如果你使用invert的话,它将会删除掉一个重复的键值对:
7检测一个健或者值是否属于一个hash
我们能够使用has_key?或者它的任意一个别名,include?, key?, 和member?来测试一个key是否属于一个hash:
你还能使用empty? 方法来测试一个hash是否为空,length来得到一个hash的大小:
如果想测试值的话,就使用has_value?或者value?:
8 将一个hash转换为一个数组
可以使用to_a来讲一个hash转换成一个数组:
如果只想把值或者健转换成数组,可以使用keys或者values :
最终你还可以基于一个健序列,来将他们所对应的值转换换成数组:
9 根据条件选择键值对
Hash类混入了Enumerable 模块,因此你能够使用detect (find), select, (find_all), grep, min, max, 和reject 这些方法.
detect (别名find)得到一个单独的键值对:
select(别名finad_all)将会返回所有符合条件的键值对:
10 排序一个hash
ruby排序的时候是将hash转换为一个数组,然后才进行排序的:
11 合并两个散列
ruby能够使用merge(别名update)方法,来合并两个hash,如果他们中的健有相同的话,一个将会被删除:
merge还可以使用block来处理,两个健有冲突的hash的合并,我们下面的代码是假设我们有两个冲突的健的话,我们选择值较小的那个键值对:
12 由一个数组来创建hash
13计算hash键的差集和交集
由于hash的key能够被转换成一个数组,因此我们能够使用一些数组的方法:
14使用hash作为一个Sparse Matrix
我们能够这样做:
15一个简单的可以包含重复健的hash
这个很简单的实现,看下代码就行了:
就想创建一个数组一样,我们能够使用Hash的[]方法来创建一个hash:
puts a1 = Hash.[]("flat",3,"curved",2) puts a2 = Hash.[]("flat"=>3,"curved"=>2) puts b1 = Hash["flat",3,"curved",2] puts b2 = Hash["flat"=>3,"curved"=>2] puts c2 = {"flat"=>3,"curved"=>2}
相似的,我们还可以使用new来创建一个hash:
puts d = Hash.new # 创建一个空的hash puts e = Hash.new(99) # 创建一个默认值为99的hash puts f = Hash.new("a"=>3) # puts e["angled"] # 99 puts e.inspect # {} puts f["b"] # {"a"=>3} (刚好默认值也是一个hash) puts f.inspect # {}
2指定一个默认值给hash
一个hash,如果你使用一个不存在的key去取值的话,将会返回给你一个nil,这里我们还可以自己定义默认值,从而来代替nil,或者我们还可以使用default=方法来改变它的默认值:
puts a = Hash.new("missing") # default value object is "missing" puts a["hello"] # "missing" puts a.default="nothing" puts a["hello"] # "nothing" puts a["good"] << "bye" # "nothingbye" puts a.default # "nothingbye"
如果当一个key不存在时,你想抛出一个异常来代替返回默认值的话,你可以使用fetch方法,当你使用fetch 方法的时候如果key不存在,它则会抛出一个IndexError异常,它还有第二个参数,这个参数就是当你key不存在的时候所返回的值:
a = {"flat"=>3,"curved"=>2,"angled"=>5} a.fetch("pointed") # IndexError puts a.fetch("curved","na") # 2 puts a.fetch("x","na") # "na" puts a.fetch("flat") {|x| x.upcase} # 3 puts a.fetch("pointed") {|x| x.upcase} # "POINTED"
3存取或者加一个键值对
hash也有像数组一样的[]和[]=方法,还有一个store,它是[]=方法的别名:
a = {} a["flat"] = 3 # {"flat"=>3} a.[]=("curved",2) # {"flat"=>3,"curved"=>2} a.store("angled",5) # {"flat"=>3,"curved"=>2,"angled"=>5} puts a
在这里要注意,nil对象也可以作为一个健或者值:
b={} b[2] # nil b[3]=nil b # {3=>nil} b[2].nil? # true b[3].nil? # true b[nil]=5 b # {3=>nil,nil=>5} b[nil] # 5 b[b[3]] # 5
4删除一个键值对
删除的话我们能够使用 clear, delete, delete_if, reject, reject!, 和shift 这些方法都能做到。
clear 将会把一个hash清空.
shift则将会删除掉最前面的一个键值对:
a = {1=>2, 3=>4} b = a.shift # [1,2] a现在是[3=>4]
delete删除一个指定位置的键值对,如果不存在这个位置,则将会返回block里的字符串:
a = {1=>1, 2=>4, 3=>9, 4=>16} a.delete(3) # 9 # a is now {1=>1, 2=>4, 4=>16} a.delete(5) # nil in this case a.delete(6) { "not found" } # "not found"
5迭代一个hash
我们能够使用each方法来做这个,它还有each_key, each_pair和 each_value方法,其中each_pair是each方法的别名:
{"a"=>3,"b"=>2}.each do |key, val| print val, " from ", key, "; " # 3 from a; 2 from b; end
each_key 和each_value的block只有一个参数:
{"a"=>3,"b"=>2}.each_key do |key| print "key = #{key};" # Prints: key = a; key = b; end {"a"=>3,"b"=>2}.each_value do |value| print "val = #{value};" # Prints: val = 3; val = 2; end
6转置一个hash
也就是将一个hash的键和值交换:
a = {"fred"=>"555-1122","jane"=>"555-7779"} b = a.invert b["555-7779"] # "jane"
注意这里有一个问题,那就是值有可能是重复的,这时如果你使用invert的话,它将会删除掉一个重复的键值对:
a = {"fred"=>"555-7779","jane"=>"555-7779"} b = a.invert puts b["555-7779"] # "jane"
7检测一个健或者值是否属于一个hash
我们能够使用has_key?或者它的任意一个别名,include?, key?, 和member?来测试一个key是否属于一个hash:
a = {"a"=>1,"b"=>2} a.has_key? "c" # false a.include? "a" # true a.key? 2 # false a.member? "b" # true
你还能使用empty? 方法来测试一个hash是否为空,length来得到一个hash的大小:
a.empty? # false a.length # 2
如果想测试值的话,就使用has_value?或者value?:
a.has_value? 2 # true a.value? 99 # false
8 将一个hash转换为一个数组
可以使用to_a来讲一个hash转换成一个数组:
h = {"a"=>1,"b"=>2} h.to_a # ["a",1,"b",2]
如果只想把值或者健转换成数组,可以使用keys或者values :
h.keys # ["a","b"] h.values # [1,2]
最终你还可以基于一个健序列,来将他们所对应的值转换换成数组:
h = {1=>"one",2=>"two",3=>"three",4=>"four","cinco"=>"five"} h.values_at(3,"cinco",4) # ["three","five","four"] h.values_at(1,3) # ["one","three"]
9 根据条件选择键值对
Hash类混入了Enumerable 模块,因此你能够使用detect (find), select, (find_all), grep, min, max, 和reject 这些方法.
detect (别名find)得到一个单独的键值对:
names = {"fred"=>"jones","jane"=>"tucker", "joe"=>"tucker","mary"=>"SMITH"} # 得到一个tucker names.detect {|k,v| v=="tucker" } # ["joe","tucker"] # 得到一个大写的 names.find {|k,v| v==v.upcase } # ["mary", "SMITH"]
select(别名finad_all)将会返回所有符合条件的键值对:
names.select {|k,v| v=="tucker" } # [["joe", "tucker"], ["jane", "tucker"]] names.find_all {|k,v| k.count("r")>0} # [["mary", "SMITH"], ["fred", "jones"]]
10 排序一个hash
ruby排序的时候是将hash转换为一个数组,然后才进行排序的:
names = {"Jack"=>"Ruby","Monty"=>"Python", "Blaise"=>"Pascal", "Minnie"=>"Perl"} list = names.sort # list is now: # [["Blaise","Pascal"], ["Jack","Ruby"], # ["Minnie","Perl"], ["Monty","Python"]]
11 合并两个散列
ruby能够使用merge(别名update)方法,来合并两个hash,如果他们中的健有相同的话,一个将会被删除:
dict = {"base"=>"foundation", "pedestal"=>"base"} added = {"base"=>"non-acid", "salt"=>"NaCl"} new_dict = dict.merge(added) # {"base"=>"non-acid", "pedestal"=>"base", "salt"=>"NaCl"}
merge还可以使用block来处理,两个健有冲突的hash的合并,我们下面的代码是假设我们有两个冲突的健的话,我们选择值较小的那个键值对:
dict = {"base"=>"foundation", "pedestal"=>"base"} added = {"base"=>"non-acid", "salt"=>"NaCl"} new_dict = dict.merge(added) {|key,old,new| old < new ? old : new } # {"salt"=>"NaCl", "pedestal"=>"base", "base"=>"foundation"}
12 由一个数组来创建hash
array = [2, 3, 4, 5, 6, 7] hash = Hash[*array] # hash is now: {2=>3, 4=>5, 6=>7}
13计算hash键的差集和交集
由于hash的key能够被转换成一个数组,因此我们能够使用一些数组的方法:
a = {"a"=>1,"b"=>2,"z"=>3} b = {"x"=>99,"y"=>88,"z"=>77} intersection = a.keys & b.keys difference = a.keys - b.keys c = a.dup.update(b) inter = {} intersection.each {|k| inter[k]=c[k] } # inter is {"z"=>77} diff={} difference.each {|k| diff[k]=c[k] } # diff is {"a"=>1, "b"=>2}
14使用hash作为一个Sparse Matrix
我们能够这样做:
cube = Hash.new(0) cube[[2000,2000,2000]] = 2 z = cube[[36,24,36]] # 0
15一个简单的可以包含重复健的hash
这个很简单的实现,看下代码就行了:
class HashDup def initialize(*all) raise IndexError if all.size % 2 != 0 @store = {} if all[0] # not nil keyval = all.dup while !keyval.empty? key = keyval.shift if @store.has_key?(key) @store[key] += [keyval.shift] else @store[key] = [keyval.shift] end end end end def store(k,v) if @store.has_key?(k) @store[k] += [v] else @store[k] = [v] end end def [](key) @store[key] end def []=(key,value) self.store(key,value) end def to_s @store.to_s end def to_a @store.to_a end def inspect @store.inspect end def keys result=[] @store.each do |k,v| result += ([k]*v.size) end result end def values @store.values.flatten end def each @store.each {|k,v| v.each {|y| yield k,y}} end alias each_pair each def each_key self.keys.each {|k| yield k} end def each_value self.values.each {|v| yield v} end def has_key? k self.keys.include? k end def has_value? v self.values.include? v end def length self.values.size end alias size length def delete k val = @store[k] @store.delete k val end def delete k,v @store[k] -= [v] if @store[k] v end # Other methods omitted here... end # This won't work... dup key will ignore # first occurrence. h = {1=>1, 2=>4, 3=>9, 4=>16, 2=>0} # This will work... h = HashDup.new(1,1, 2,4, 3,9, 4,16, 2,0) k = h.keys # [4, 1, 2, 2, 3] v = h.values # [16, 1, 4, 0, 9] n = h.size # 5 h.each {|k,v| puts "#{k} => #{v}"} # Prints: # 4 => 16 # 1 => 1 # 2 => 4 # 2 => 0 # 3 => 9
发表评论
-
一个创建闭包的小技巧
2008-06-05 00:12 2135一个小技巧,在Ola Bini 的blog上看到的。 假设你 ... -
解决Colored Cubes问题
2008-06-02 10:43 2785Engineering Puzzle You have fo ... -
ruby1.9中的Iterators
2008-03-05 22:37 3722在ruby1.9中增加了External Iterators这 ... -
一个简单的ruby Metaprogram的例子
2008-03-03 23:49 4104比如下面一个文件 people.txt 引用name,age ... -
Ruby Object Model
2008-03-03 19:29 3576刚好看到,保存一下. -
一个检测方法的参数类型的小程序
2008-03-02 22:48 3249今天没事看blog的时候,看到一个小子实现了这个,不过他的程序 ... -
rails中的BlankSlate源码分析
2008-02-28 23:27 3448其实这个类实现的功能很简单,那就是实现一个没有predefin ... -
ruby中的类变量与类实例变量
2008-02-26 21:15 7636首先,在ruby1.8中类变量是所有子类和父类共享的,可以看下 ... -
在ubuntu上共存多个版本的ruby
2008-02-24 15:20 4377今天装Revactor库的时候,真把我郁闷了,没想到ubunt ... -
看到了一个用ruby写的scheme解释器
2008-02-16 21:35 3771,自己本来想等啥时候有时间做个类似的东西呢,没想到已经有人做 ... -
ruby way之处理RSS和Atom
2008-01-31 01:32 35231 rss 标准库 RSS 是基于xml的,因此你能简单的将 ... -
ruby way之使用REXML解析xml
2008-01-30 00:35 9255REXML 是一个完全用ruby写的processor ,他有 ... -
rails2中的一些被废弃的用法
2008-01-29 00:33 2544这些只是自己最近看web开发敏捷之道的时候(由于书中的版本是1 ... -
ruby way之动态特性之二
2008-01-25 00:49 36831 得到所定义的实体的列表 ruby的反射api能够使我们在 ... -
ruby way之动态特性之一
2008-01-23 01:25 45491 动态的evaluate代码 全局的方法eval 编译并且 ... -
ruby way之高级OOP特性之二
2008-01-20 03:43 29511 把代码像对象一样存储 当你想要以对象的形式存储一块代码的 ... -
ruby way之高级OOP特性之一
2008-01-19 12:14 22681 发送一条消息给一个对象 当你调用一个方法时,你也就是发送 ... -
ruby way之OOP之二
2008-01-16 23:59 23641 理解allocate 在一些特殊的环境中,你可能需要不调 ... -
ruby way之OOP之一
2008-01-16 00:25 26381 使用多个构造方法 在ruby中没有像c++或者ruby中 ... -
ruby way之连接数据库
2008-01-14 00:47 2477这边都只是个大概,具体的要自己去看文档了. 1 连接SQLi ...
相关推荐
**Ruby-Hashie:扩展哈希的实用工具集** Ruby是一种动态、面向对象的编程语言,以其简洁和优雅的语法而闻名。在Ruby中,哈希(Hash)是一种常用的数据结构,它允许我们通过键(key)来访问值(value)。然而,尽管...
1. **数据结构**: Redis支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构使得Redis在处理复杂的数据操作时表现出色。 2. **持久化*...
计算facebook sdk需要的key hashes。使用方法: 1,安装自己的apk,带正式签名 2,安装本apk,输入待寻找apk的包名,点击计算便会得到
7. **哈希与符号化键(Hashes and Symbolized Keys)**:在Rails中,使用符号作为哈希键可以提高性能,因为符号是不可变的,且在内存中只存储一次。 8. **部分视图(Partials)**:部分视图是可重用的视图代码块,...
第5章:哈希(Hashes)是Ruby中的键值对集合,类似于其他语言中的字典。在本章节中,将介绍如何创建和使用哈希,以及相关的操作方法。 第6章:数字。Ruby支持整数和浮点数,并为这些基本数据类型提供了一系列内置的...
Ruby Koans 将带您走上启蒙之路,以学习 Ruby。 目标是学习 Ruby 语言、语法、结构以及一些常用函数和库。 我们还通过以测试为基础来教你文化。 测试不仅仅是我们口头上的事情,而是我们生活的事情。 测试对于您在 ...
javascript-Hashes.rar
Ruby Koans 将带您走上启蒙之路,以学习 Ruby。 目标是学习 Ruby 语言、语法、结构以及一些常用函数和库。 我们还通过以测试为基础来教你文化。 测试不仅仅是我们口头上的事情,而是我们生活的事情。 测试对于您在 ...
5. **数组与哈希(Arrays and Hashes)**:数组是有序的元素集合,哈希则是一组键值对,两者都是存储和操作数据的重要数据结构。Ruby提供了丰富的操作方法,如遍历、索引、添加和删除元素等。 6. **符号(Symbols)...
<br> <br>Strings and numbers <br>Arrays and hashes <br>Classes, modules, and namespaces <br>Reflection and metaprogramming <br>XML and HTML processing<br><br>Ruby on Rails ...
python官网-哈希hashes.rar
哈希和可枚举:使用#each遍历哈希概述我们将使用迭代来访问和操作哈希中的数据。目标区分遍历数组与遍历哈希。 使用#each遍历哈希。遍历哈希以前,我们已经将哈希与字典或存储容器进行了比较。 就像现实中的这些存储...
《PyPI官网下载 | d8s_hashes-0.6.0.tar.gz——深入解析Python库的发布与使用》 PyPI(Python Package Index)是Python开发者的重要资源库,它为全球Python用户提供了丰富的第三方模块和库,使得开发变得更加便捷...
哈希实验室简介 目标 建立简单的哈希。 构建嵌套的哈希。 访问和修改散列中存储的数据。 将新数据添加到哈希中。 ...分叉并克隆此实验室,并使用learn命令运行测试套件。请注意此实验室的测试套件。...
在IT领域,哈希(Hashes)是一种广泛使用的数据处理技术,主要应用于数据验证、存储和加密。哈希函数是将任意长度的输入(也叫做预映射或消息)转化为固定长度输出的过程,这个输出通常被称为哈希值或指纹。哈希函数...
在网络安全领域,保护用户账户免受恶意攻击是至关重要的任务之一。通用密码,也称为常见密码或弱密码,是那些容易被猜到或者容易被字典攻击破解的密码。为了提高用户账户的安全性,开发者经常需要采取措施防止用户...
* fork the Ruby Koans repo* check out your fork of the repo* make some tests pass* commit your changes* push your changes to github新的Ruby Koans Ruby Koans 将带您走上启蒙之路,以学习 Ruby。...
"python-hashes"这个主题可能涉及到Python中的哈希算法和相关的模块。 在Python中,哈希(Hash)通常指的是哈希表或哈希函数,它们是数据结构和算法的重要组成部分。哈希函数能够将任意大小的数据转换成固定大小的...