ruby - 使用哈希图测试订单
问题描述
我是一个红宝石初学者,读到哈希没有顺序。我尝试使用这个概念,但发现我仍然可以订购这样的东西:
Travel_Plans = Hash.new
Travel_Plans[4] = "Colorado Springs"
Travel_Plans[1] = "Santa Fe"
Travel_Plans[2] = "Raton"
Travel_Plans[5] = "Denver"
Travel_Plans[3] = "Pueblo"
puts Travel_Plans.sort
有人可以解释“哈希没有顺序”是什么意思吗?
如果你能提供一个简单的例子那就太好了。
解决方案
Ruby 的Hash
类用传统术语表示“哈希映射”或“键值字典”。这些旨在成为允许快速随机访问单个元素的结构,但元素本身没有内在顺序。
在内部,Ruby使用每个对象必须提供用作键Hash
的方法将元素组织到内存中的各个位置。hash
RubyHash
非常灵活,即使不是非常灵活,因为一个对象,任何对象,都可以用作键,并且完全按原样保存。与 JavaScript 相比,键必须是字符串并且只能是字符串。
这意味着你可以这样做:
{ 1 => 'Number One', '1' => 'String One', :one => 'Symbol One', 1.0 => 'Float One }
其中有四个完全不同的键。
这与Array
排序是数组工作方式的重要组成部分形成对比。您不希望有一个队列,事情以一种顺序出现并以另一种顺序出现。
现在 Ruby 的Hash
类过去没有内在顺序,但由于流行的需求,现在它以插入的形式存储顺序。也就是说,插入的第一个项目是“第一个”。通常你不会明确地依赖这种行为,但如果你注意的话,它确实会出现:
a = { x: '1', y: '2' }
# => {:x=>"1, :y=>"2"}
b = { }
b[:y] = '2'
b[:x] = '1'
b
# => {:y=>"2", :x=>"1"}
请注意,b
由于以相反的顺序插入它们,因此键的顺序是相反的。它们仍然是等价的:
a == b
# => true
当您调用sort
a时Hash
,您实际上最终将其转换为键/值对数组,然后对其中的每一个进行排序:
b.sort
# => [[:x, "1"], [:y, "2"]]
Hash
如果需要,您可以将其转换回:
b.sort.to_h
# => {:x=>"1", :y=>"2"}
所以现在它被正确地“订购”了。但在实践中,这并不重要,因为您将根据需要单独访问密钥。b[:x]
不在乎:x
键在哪里,无论如何它总是返回正确的值。
关于 Ruby 的一些注意事项:
- 不要使用
Hash.new
,而只是使用{ }
来表示一个空的 Hash 结构。 - 不要对变量使用大写字母,它们在 Ruby 中具有重要意义。
Travel_Plans
是常数,而不是变量,因为它以大写字母开头。这些是为使用而保留ClassName
的CONSTANT_NAME
。这应该是travel_plans
。
推荐阅读
- python - 缩放数据错误:“ValueError:使用序列设置数组元素。”
- python - Pylint 错误“R0201:POST 方法可能是一个函数(非自用)”
- html - 当我减小屏幕宽度时,为什么导航边框会忽略我的锚标记?
- google-maps - google map url - 如何将自定义名称以及 url 中的 lat 和 long 传递给 google maps?
- javascript - javascript函数中的()和{}有什么区别?
- sql - PL/SQL - 使用另一个表中的值更新具有最大日期的行
- java - 将双打分组以映射以创建直方图
- c# - 闪烁选项卡自定义标题
- android - 我想把变量放在 get String()
- c++ - C++ 在编译时用 constexpr char 数组指针分配静态数组?