
散列
关联数组是这样的数组,它的每个数据元素与一个键相对配对,该键用于识别数据元素。由于散列函式用来创建关联数组中的指定元素,并在关联数组中查找指定元素,因此关联数组通常称为散列。在某种意义上,数组元素与列表类似,而散列元素的存放与几何类似,其元素之间没有相对次序。在Ruby中,数组与散列之间的两个最本质的区别是:数组使用数值下标来定位特定的元素,而散列使用字元串值(键)来定位元素;数组中的元素按下标排序,而散列中的元素则不是。散列的创建方法有两种:new方法或将一个字面量赋值给一个变数。
基本介绍
- 中文名:散列
- 外文名:hash
- 别名:哈希讯息摘要,关联数组
- 创建方法:new方法,将字面量赋值给变数
- 实现工具:单向数学函式(也称为散列算法)
- 数组与散列:有两个最本质的区别
定义
通过将单向数学函式(有时称为散列算法)套用到任意数量的数据所得到的固定大小的结果。假如输入数据中发生更改,则讯息摘要的结果值也将更改。讯息摘要也被称为散列。
关联数组是这样的数组,它的每个数据元素与一个键相对配对,该键用于识别数据元素。由于散列函式用来创建关联数组中的指定元素,并在关联数组中查找指定元素,因此关联数组通常称为散列。
存储地址=Hash(关键码) Hash-散列函式
所谓散列就是通过吧关键码值映射到表中的一个位置来访问记录的过程。大多数散列方法根据地址计算需要的顺序把记录放到表中,这样就不用根据值或者频率的顺序放置记录了。
散列查找法(也称杂凑查找法)是通过对记录的关键字进行某个函式,直接得到记录的存储地址,不需要进行关键字的反覆比较。
区别
散列与数组的区别
在Ruby中,数组与散列之间的两个最本质的区别是:
(1)数组使用数值下标来定位特定的元素,而散列使用字元串值(键)来定位元素;
(2)数组中的元素按下标排序,而散列中的元素则不是。
在某种意义上,数组元素与列表类似,而散列元素的存放与几何类似,其元素之间没有相对次序。散列元素在记忆体中的实际存放次序取决于散列函式对元素的插入与访问方式。
创建方法
与数组一样,也可以通过两种方法创建散列。
new方法
需要注意的是,如果将不带参数的new方法传送到Hash类,则会创建一个用{}表示的空散列。例如:
>> my_hash = Hash.new
>> my_hash = Hash.new
=> {}
将一个字面量赋值给一个变数
在该种方法中,字面量是一个散列字面量,其中每个元素通过由符号=>分隔开的键/值对来指定。散列字面量用大括弧定界。例如:
>>kids_ages = {"John" => 44,"Genny" => 42,"Jake" =>28,"Darcie" =>27}
=> { "Darcie" =>27,"John" => 44,"Genny" => 42,"Jake" =>28}
需要注意,Ruby返回的散列的顺序与创建散列所用的散列字面量的顺序是不同的。这是因为散列在记忆体中的实际顺序是不可预知的(至少对用户程式而言是这样的)。
基本操作
访问散列中的单个值元素
可通过将键用作下标来引用散列的方式访问散列中的单个值元素。与访问数组元素一样,使用方括弧来指定这种下标操作。例如:
>> kids_ages["Genny"]
=> 42
向散列中添加新值
可通过将新元素的值赋给新元素的键引用散列添加新值,如下所示:
>> kids_ages["Aidan"] = 10;
=> {"Aidan"=>10,"Darcie" =>27,"John" => 44,"Genny" => 42,"Jake" =>28}
删除散列元素
可用delete方法删除散列元素,delete方法的参数是一个元素键。例如:
>> kids_ages.delete("Genny")
=>42
=>kids_ages
=>{"Aidan"=>10,"Darcie" =>27,"John" => 44,"Jake" =>28}
将散列设定为空散列
可採用两种方法将散列设定为空散列:
(1)把一个空散列字面量赋给散列,例如:
>> hi_temps = {"mon" => 74,"tue" =>78}
=>{"mon" => 74,"tue" =>78}
>> hi_temp = { }
=> { }
(2)对散列使用clear方法,例如:
>> salaries = {"Fred" => 47400,"Mike" =>45250}
=>{"Fred" => 47400,"Mike" =>45250}
>> salaries.clear
=> { }
确定散列中是否具有某一特定建的元素
判定方法 has_key? 用于确定散列中是否具有某一特定建的元素。例如,假设仍採用前文中定义的kids_ages散列,则has_key?的用法如下所示:
>> kids_ages.has_key?("John")
=> true
>> kids_ages.has_key?("Henry")
=> false
提取散列的值到数组中
可分别使用方法keys和values将散列的键和值提取到数组中,如下所示:
>>kids_ages.keys
=> ["Aidan","Darcie","John","Jake"]
>> kids_ages.values
=> [10,27,44,28]