ruby的数据结构--哈希(Hash)

1、哈希(Hash)

哈希也是存储对象的一个集合,哈希里面的元素是以"key" => “value”(键值对)这样的形式存在的,元素是没有顺序的,哈希的键可以是任意对象,键必须的唯一的,键通常用符号(Symbol)表示。

哈希的创建有两种形式,两种形式都是一样的,最常使用第二种:

irb(main):108:0> hash_1 = {:name => "Mary",:age => 12}

=> {:name=>"Mary", :age=>12}

irb(main):109:0> hash_2 = {name:"Mary",age:12}

=> {:name=>"Mary", :age=>12}

1

2

3

4

2、类型转换

(1)哈希转字符串to_s

irb(main):110:0> hash = {name:"Mary",age:12}

=> {:name=>"Mary", :age=>12}

irb(main):111:0> hash_str = hash.to_s

=> "{:name=>\"Mary\", :age=>12}"

1

2

3

4

(2)字符串转哈希eval,字符串必须是将hash转成字符串的那种格式,不是任意字符串都可以转成hash。通常用于从文件中读取hash的情况。

#定义一个字符串,字符串是将hash转成字符串的格式

irb(main):111:0> hash_str = "{:name=>\"Mary\", :age=>12}"

irb(main):112:0> eval(hash_str)

=> {:name=>"Mary", :age=>12}

#随便定义一个字符串

irb(main):113:0> str = "hello"

=> "hello"

#eval会报错,eval转换的字符串必须是将hash转成字符串的格式

irb(main):114:0> eval(str)

NameError: undefined local variable or method `hello' for main:Object

Did you mean?  help

from (irb):114:in `eval'

from (irb):114:in `eval'

from (irb):114

1

2

3

4

5

6

7

8

9

10

11

12

13

14

3、哈希操作

(1)== 判断两个哈希是否相等,要求每个键值对的类型和内容都相等,不要求顺序也一样,因为哈希中的元素是没有顺序的

irb(main):116:0> h1 = {7 => 35, "c" => 2, "a" => 1}

=> {7=>35, "c"=>2, "a"=>1}

irb(main):117:0> h2 = {"c" => 2, "a" => 1, 7 => 35}

=> {"c"=>2, "a"=>1, 7=>35}

irb(main):118:0> h3 = {:c => 2, :a => 1, 7 => 35}

=> {:c=>2, :a=>1, 7=>35}

irb(main):119:0> h1 == h2

=> true

#h2、和h3中元素的区别是键的类型,:c为符号类型、"c"为字符串类型,所以两个hash不相等

irb(main):120:0> h2 == h3

=> false

1

2

3

4

5

6

7

8

9

10

11

(2)hash[key] 通过key取哈希的值

irb(main):121:0> hash = {7 => 35, "c" => 2, "a" => 1}

=> {7=>35, "c"=>2, "a"=>1}

irb(main):122:0> hash[7]

=> 35

irb(main):123:0> hash["c"]

=> 2

#hash中不包含key值为:c的键,返回nil

irb(main):124:0> hash[:c]

=> nil

1

2

3

4

5

6

7

8

9

(3)hash[key] = value 如果key值已存在,则将key对应的值替换为value。如果key值不存在,则新建key => value 键值对

irb(main):125:0> hash = {7 => 35, "c" => 2, "a" => 1}

=> {7=>35, "c"=>2, "a"=>1}

#key为7已存在,7所对应的值被替换成888

irb(main):126:0> hash[7] = 888

=> 888

#key为:c不存在,新建:c=>3键值对

irb(main):127:0> hash[:c] = 3

=> 3

irb(main):128:0> hash

=> {7=>888, "c"=>2, "a"=>1, :c=>3}

1

2

3

4

5

6

7

8

9

10

(4)hash.delete(key) 删除key所在的键值对,并返回key所对应的value值

irb(main):129:0> hash = {7 => 35, "c" => 2, "a" => 1}

=> {7=>35, "c"=>2, "a"=>1}

irb(main):130:0> hash.delete("c")

=> 2

#hash中不包含key值为:c的键,返回nil

irb(main):131:0> hash.delete(:c)

=> nil

1

2

3

4

5

6

7

(5)hash.delete_if {| key,value | block } 删除满足block条件的键值对

irb(main):132:0> hash = {"1" => 100, "2" => 200, "3" => 300}

=> {"1"=>100, "2"=>200, "3"=>300}

#删除掉value的值大于280的键值对

irb(main):133:0> hash.delete_if {|key,value| value > 280}

=> {"1"=>100, "2"=>200}

#现在hash中的元素

irb(main):134:0> hash

=> {"1"=>100, "2"=>200}

1

2

3

4

5

6

7

8

(6)each 遍历哈希

hash.each {| key,value | block } 遍历每个键值对

hash.each_key {| key | block } 遍历每个键

hash.each_value {| value | block } 遍历每个值

#用第二种形式定义hash,是不是比第一种的简单

irb(main):140:0> hash = {a:100,b:200,c:300}

=> {:a=>100, :b=>200, :c=>300}

#遍历键值对,块中有两个变量,第一个变量是键,第二个变量是值

irb(main):141:0> hash.each {|key,value| puts "键为#{key},值为#{value}"}

键为a,值为100

键为b,值为200

键为c,值为300

=> {:a=>100, :b=>200, :c=>300}

#只遍历键,块中的变量是键

irb(main):142:0> hash.each_key {|key| puts "键为#{key}"}

键为a

键为b

键为c

=> {:a=>100, :b=>200, :c=>300}

#只遍历值,块中的变量是值

irb(main):143:0> hash.each_value {|value| puts "值为#{value}"}

值为100

值为200

值为300

=> {:a=>100, :b=>200, :c=>300}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

(7)hash.empty? 判断哈希是否为空,为空返回true,否则返回false

irb(main):001:0> h_1 = {}

=> {}

irb(main):002:0> h_1.blank?

=> true

1

2

3

4

(8)include 判断哈希中是否有某个值

hash.include?(key) 判断哈希中是否有键key,有返回true,没有返回false

hash.has_key?(key) 与include?方法同样用法

hash.has_value?(value) 判断哈希中是否有值value,有返回true,没有返回false

irb(main):003:0> hash = {a:100,b:200,c:300}

=> {:a=>100, :b=>200, :c=>300}

irb(main):004:0> hash.include?(100)

=> false

irb(main):005:0> hash.include?(:a)

=> true

irb(main):006:0> hash.has_value?(100)

=> true

1

2

3

4

5

6

7

8

(9)数组形式返回键、值

hash.keys 以数组的形式返回哈希所有的key

hash.values 以数组的形式返回哈希所有的value

irb(main):007:0> hash = {a:100,b:200,c:300}

=> {:a=>100, :b=>200, :c=>300}

irb(main):008:0> hash.keys

=> [:a, :b, :c]

irb(main):009:0> hash.values

=> [100, 200, 300]

1

2

3

4

5

6

(10)hash.length 哈希的长度

irb(main):010:0> hash = {a:100,b:200,c:300}

=> {:a=>100, :b=>200, :c=>300}

irb(main):011:0> hash.length

=> 3

1

2

3

4

(11)hash_1.merge(hash_2) 将hash_1和hash_2两个哈希里面的元素合起来,返回一个新的哈希,如果hash_1和hash_2两个哈希里面有相同的key值,则key对应的值以后面的哈希(即hash_2)中的值为准。

hash_1.merge(hash_2) hash_1的值不会改变

hash_1.merge!(hash_2) hash_1的值会改变

irb(main):012:0> hash1 = {a:100,b:200}

=> {:a=>100, :b=>200}

irb(main):013:0> hash2 = {b:300,d:400}

=> {:b=>300, :d=>400}

irb(main):014:0> hash1.merge(hash2)

=> {:a=>100, :b=>300, :d=>400}

#hash1中的值没有改变

irb(main):016:0> hash1

=> {:a=>100, :b=>200}

#merge!

irb(main):017:0> hash1.merge!(hash2)

=> {:a=>100, :b=>300, :d=>400}

#hash1中的值发生了改变

irb(main):018:0> hash1

=> {:a=>100, :b=>300, :d=>400}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

(12)reject、select返回不满足条件或者满足条件的键值对

hash.reject {|key,value| block} 返回所有不满足block条件的元素,hash本身不会改变

hash.reject! {|key,value| block} 返回所有不满足block条件的元素,hash本身会改变

hash.select {|key,value| block} 返回所有满足block条件的元素,hash本身不会改变

hash.select! {|key,value| block} 返回所有满足block条件的元素,hash本身会改变

irb(main):019:0> hash = {a:100,b:200,c:300}

=> {:a=>100, :b=>200, :c=>300}

irb(main):020:0> hash.reject {|k,v| v > 200}

=> {:a=>100, :b=>200}

irb(main):021:0> hash.select {|k,v| v > 200}

=> {:c=>300}

————————————————

版权声明:本文为CSDN博主「猫宁一」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/shine_a/article/details/85276270

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,026评论 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,269评论 0 10
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,438评论 0 13
  • 北方有佳人 绝世而独立 一顾倾人城 再顾倾人国 宁不知倾人与倾国 佳人再难得
    最难的错过阅读 215评论 0 0
  • (题外话: 其实我也是刚学怎么编写shell脚本,可能写得有不好的地方,多多见谅) 平时我们编写完java程序后,...
    PigPIgAutumn阅读 12,355评论 0 4