首页 > 解决方案 > 使用哈希图测试订单

问题描述

我是一个红宝石初学者,读到哈希没有顺序。我尝试使用这个概念,但发现我仍然可以订购这样的东西:

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

有人可以解释“哈希没有顺序”是什么意思吗?

如果你能提供一个简单的例子那就太好了。

标签: rubyhashhashmap

解决方案


Ruby 的Hash类用传统术语表示“哈希映射”或“键值字典”。这些旨在成为允许快速随机访问单个元素的结构,但元素本身没有内在顺序。

在内部,Ruby使用每个对象必须提供用作键Hash的方法将元素组织到内存中的各个位置。hashRubyHash非常灵活,即使不是非常灵活,因为一个对象,任何对象,都可以用作键,并且完全按原样保存。与 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

当您调用sorta时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是常数,而不是变量,因为它以大写字母开头。这些是为使用而保留ClassNameCONSTANT_NAME。这应该是travel_plans

推荐阅读