`
java-admin
  • 浏览: 1376470 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

Ruby学习七 Hash(1)

 
阅读更多

 

http://bbs.chinaunix.net/thread-1826613-1-1.html

 

本帖最后由 zuerrong 于 2010-12-02 18:27 编辑

1. 如何创建Hash?

QUOTE:
x = Hash.new
x = {}
x = {:a => 1, :b => 2}




这些都是创建Hash的方法。
第一个和第二个一样,表示创建空的Hash.
第三个表示创建的Hash,有2对键/值。

2. Hash的键是哪些类型?

可以是任何目标,如:

QUOTE:
irb(main):002:0> x={}
=> {}
irb(main):003:0> x[1]=2
=> 2
irb(main):004:0> x["a"]="b"
=> "b"
irb(main):005:0> x[:z] = 100
=> 100
irb(main):006:0> x[[1,2,3]] = [4,5,6]
=> [4, 5, 6]
irb(main):007:0> x
=> {"a"=>"b", [1, 2, 3]=>[4, 5, 6], 1=>2, :z=>100}




有两点注意:
(1)任何目标包括数组、Hash都可以是Key。
(2)使用字符作为Key时,最好使用对应的符号。例如,键"a"可以用:a来代替。这是因为每个字符"a"都是一个目标,而:a是唯一的,

更节省内存

3. 如何给Hash赋默认的值?

QUOTE:
irb(main):003:0> x=Hash.new([])
=> {}
irb(main):004:0> x[:a]
=> []




表示创建一个Hash,它的默认值是空的数组[]。
然后访问x[:a],虽然这个键没有事先定义,但还是有默认值。

请注意:这种方法赋的默认值,都指向同一个目标,这个目标改变了,会影响到所有默认值。

QUOTE:
irb(main):005:0> x[:a] << 1
=> [1]
irb(main):006:0> x[:b]
=> [1]




要做到每个键都对应唯一的默认值,应该如此创建Hash:

QUOTE:
irb(main):007:0> y=Hash.new do |h,k| h[k] =[] end
=> {}




让我们再看看:

QUOTE:
irb(main):009:0> y[:a] << 1
=> [1]
irb(main):010:0> y[:b]
=> []




一个值的改变,不会影响到其他默认值。

4. 如何遍历Hash?

QUOTE:
irb(main):018:0* x={1=>2,3=>4,5=>6}                  
=> {5=>6, 1=>2, 3=>4}

irb(main):019:0> x.each do |k,v| puts "#{k} #{v}" end   
5 6
1 2
3 4
=> {5=>6, 1=>2, 3=>4}




使用Hash的each方法。

5. 如何遍历Hash的Key和Value?

QUOTE:
irb(main):020:0> x.keys.each do |k| puts k end

irb(main):021:0> x.values.each do |v| puts v end




使用Hash的keys和values方法,它们返回一个数组。

当然还可以使用each_key和each_value方法,顾名思义就是遍历key和value.

QUOTE:
irb(main):016:0> x.each_key do |s| puts s end
1
3
=> {1=>2, 3=>4}
irb(main):017:0> x.each_value do |s| puts s end   
2
4
=> {1=>2, 3=>4}




6. Hash可以sort吗?

ruby的hash实际是可以sort的,返回一个sort后的二维数组。

QUOTE:
irb(main):027:0> x
=> {5=>6, 1=>2, 3=>4}

irb(main):028:0> x.sort
=> [[1, 2], [3, 4], [5, 6]]




另外ruby有OrderedHash这个类,它可以让Hash元素按插入顺序来sort,类似于数组的能力。

7. 如何从Hash里添加和删除元素?

增加元素,直接定义Key/Value:

QUOTE:
irb(main):040:0> x[7]=8
=> 8

irb(main):041:0> x
=> {5=>6, 1=>2, 7=>8, 3=>4}




删除元素,使用delete方法,参数是想删除的Key:

QUOTE:
irb(main):042:0> x.delete(7)
=> 8

irb(main):043:0> x
=> {5=>6, 1=>2, 3=>4}




当然也可以用delete_if带条件的删除Hash元素。例如删除所有Key大于3的:

QUOTE:
irb(main):074:0* x.delete_if do |k,v| k>3 end
=> {1=>2, 3=>4}




8. 如何查找Hash元素?

使用has_key?和has_value?来判断是否有对应键和值:

QUOTE:
irb(main):052:0> x.has_key? 1
=> true

irb(main):053:0> x.has_value? 4
=> true

irb(main):054:0> x.has_key? 9
=> false




考虑到默认值的情况,不能直接用if hash[:key]来判断,例如:

QUOTE:
irb(main):055:0> y=Hash.new(9)
=> {}

irb(main):056:0> y.has_key? :a
=> false

irb(main):057:0> puts 1 if y[:a]
1
=> nil




其他的查找方法,还有find、select等,例如找到所有Key大于2的元素:

QUOTE:
irb(main):038:0> x.select do |k,v| k>2 end
=> [[5, 6], [3, 4]]




9. 可以反转Hash吗?

答案是可以,使用invert方法:

QUOTE:
irb(main):011:0* x={1=>2,3=>4,5=>6}
=> {5=>6, 1=>2, 3=>4}

irb(main):012:0> x.invert
=> {6=>5, 2=>1, 4=>3}




10. Hash和数组如何转换?

Hash转换到数组很简单:

QUOTE:
irb(main):020:0> x.to_a
=> [[5, 6], [1, 2], [3, 4]]




数组转换到Hash麻烦一点,自己写一个方法to_hash:

QUOTE:
irb(main):023:0> class Array
irb(main):024:1>   def to_hash
irb(main):025:2>     unless size%2 == 0
irb(main):026:3>       raise "array with odd number of elements"
irb(main):027:3>     end
irb(main):028:2>     hash = Hash.new
irb(main):029:2>     0.step(size-1,2) {|x| hash[self[x]] = self[x+1] }
irb(main):030:2>     hash
irb(main):031:2>   end
irb(main):032:1> end
=> nil

irb(main):033:0> x=[1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]

irb(main):034:0> x.to_hash
=> {5=>6, 1=>2, 3=>4}




11. Hash的丢值行为?

任何时候修改了Hash的Key(记住Key是包括数组在内的目标),都会发生丢值行为。

QUOTE:
irb(main):001:0> h=Hash.new
=> {}
irb(main):002:0> x=[1,2,3]
=> [1, 2, 3]
irb(main):003:0> h[x]=4
=> 4
irb(main):004:0> h[x]
=> 4
irb(main):005:0> x<<4
=> [1, 2, 3, 4]
irb(main):006:0> h[x]




上述修改了键x的值,那么这个键对应的Value就丢失了。
解决办法是rehash。任何时候修改了Key的值,都要rehash一次。

QUOTE:
irb(main):007:0> h.rehash
=> {[1, 2, 3, 4]=>4}
irb(main):008:0> h[x]   
=> 4

 

分享到:
评论

相关推荐

    Ruby中关于hash的基本使用方法

    通过本篇文章的学习,我们可以了解到Ruby中哈希的基本使用方法。哈希是Ruby中非常重要的数据结构之一,它为我们提供了强大的键值对管理功能,并且可以通过各种方法来操作这些键值对。无论是创建哈希、访问其值还是...

    Ruby学习笔记(学习心得)

    Ruby学习笔记 01 类的属性与方法 02 访问控制 03 Container(Array/Hash) 04 Iterator 05 简单数据类型 06 范围 07 方法 08 条件控制 09 异常处理

    Ruby学习资料chm

    这份"Ruby学习资料chm"集合了关于Ruby的基础学习材料,对于初学者或是希望深入理解Ruby的人来说是一份宝贵的资源。 Ruby的核心特性包括: 1. 面向对象:在Ruby中,一切都是对象,包括基本的数据类型如整数、字符串...

    Ruby自学笔记

    Ruby的数组可以通过转换为Hash,但这要求数组必须包含偶数个元素。具体操作时,使用星号(*)操作符配合Hash构造函数可以实现数组到Hash的转换。 在Ruby的方法中,如果方法名末尾带有感叹号(!),表示该方法会改变原有...

    精华ruby学习笔记和代码

    这个笔记里包含了ruby的整型,字符串,浮点数,布尔等基础数据类型,还有数组,哈希hash的用法, 类的定义,函数方法,以及对象定义,其他高级用法解释,除了笔记记录的语法糖之外,还包含了一些解释性的代码,帮助...

    学习 Ruby 的笔记以及 Demo(简介、语言特性、应用场景、Ruby 注释、Ruby 文件的构造与析构语句Ruby 变量等)

    Ruby 学习笔记 1、简介 定义:一种简单快捷的面向对象脚本语言 开发者:松本行弘 开发时间:1995年 设计目的:A PROGRAMMER'S BEST FRIEND【程序员的最佳朋友】 文件扩展名:rb 2、语言特性 真正的面向对象编程语言 ...

    ds_hash:Ruby 哈希类扩展

    Ruby Hash类扩展。 安装 gem install ds_hash 通过实例学习 哈希。 deep_key? hash = { :a =&gt; { :b =&gt; 'b' } } hash . deep_key? :a , :b # return true hash . deep_key? :a , :x # return false 哈希。 deep_...

    ruby基础学习资料

    Ruby支持五种基本的数据类型:符号(Symbol)、字符串(String)、数字(Numeric)、数组(Array)和哈希(Hash)。变量分为四种:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头...

    ruby中文手册 chm

    1. **Ruby用户指南**: 用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构(如if语句、循环)、函数、类与对象、模块、继承等。此外,还会涉及异常处理、文件操作、正则表达式和字符串处理等内容,...

    ruby官方chm文档

    本套官方文档包含了关于Ruby核心库、标准库、语言特性和整体框架的详细信息,是学习和深入理解Ruby不可或缺的参考资料。 《ruby23-stdlib.chm》文档主要涵盖了Ruby的标准库(Standard Library)。Ruby标准库提供了...

    绿化ruby193

    这对于学习和理解Ruby的语法、类库和方法非常有帮助。 5. **lib**:这个目录是Ruby的核心库和标准库所在的位置。它包含了各种内置模块和类,如`Array`、`String`、`Hash`等,以及一些实用工具,如`irb`(交互式Ruby ...

    learning-ruby.

    1. **变量和数据类型**:Ruby支持多种数据类型,包括整型(Integer)、浮点型(Float)、字符串(String)、布尔型(Boolean)以及符号(Symbol)。此外,Ruby还有数组(Array)和哈希(Hash)等复合数据类型。 2. ...

    ruby介绍及相应的ruby demo示意源码,供大家参考学习

    4. `hash_usage.rb`:展示了Ruby哈希(Hash)的使用,哈希是一种键值对的数据结构。 ```ruby person = {"name" =&gt; "Bob", "age" =&gt; 30} puts "Name: #{person["name"]}, Age: #{person["age"]}" ``` 5. `file_io.rb...

    ruby中文文档中心资料

    Ruby的标准库非常丰富,提供了许多内置的模块和类,如File用于文件操作,Array和Hash提供数据结构支持,Net模块用于网络编程,如HTTP请求,Socket编程等。除此之外,Ruby的Gem生态系统是其强大之处,包含了数万个第...

    ruby-2.5.8.tar.gz

    1. **版本号的意义**:Ruby的版本号通常由主版本号、次版本号和修订号组成,如2.5.8。这里,2代表主版本,5代表次版本,8是修订号。主版本号变化通常意味着有重大更新或不向后兼容的改变;次版本号更新则包含新功能...

    RUBY 教程.doc

    RUBY的设计哲学是代码可读性和效率并重,其语法简洁明了,易于理解和学习。RUBY支持多重编程范式,如函数式编程、命令式编程等,这使得开发者可以根据实际需求灵活选择编程方式。 #### 二、RUBY环境搭建与配置 1. ...

    ruby实用函数和实例

    Ruby是一种强大的、面向对象的脚本编程语言,以其简洁、优雅的语法和强大的功能而闻名。在Ruby中,有许多实用的内置函数和方法,这些...通过学习和实践,我们可以利用Ruby的这些工具来提升我们的开发效率和代码质量。

    ruby trap 初学者使用

    "Ruby Trap"这个标题暗示了这是一本关于Ruby编程中常见问题和陷阱的电子书,旨在帮助初学者避免在学习过程中遇到的困扰。下面,我们将深入探讨一些可能涵盖在书中的Ruby编程知识点。 1. **变量和常量**: - Ruby有...

    ruby api html

    Ruby 提供了一套丰富的内建类和模块,如 `String`、`Array`、`Hash` 等,开发者可以基于这些构建自己的应用。 在 Ruby API 文档中,你可能会看到以下关键概念: 1. 类(Class):表示对象的类型,如 `String`、`...

Global site tag (gtag.js) - Google Analytics