gpt4 book ai didi

ruby - 使用 HashMap 测试顺序

转载 作者:数据小太阳 更新时间:2023-10-29 08:21:53 27 4
gpt4 key购买 nike

我是 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 类用常规术语表示“ HashMap ”或“键值字典”。这些旨在成为允许快速随机访问单个元素的结构,但元素本身没有内在顺序。

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

当您在 Hash 上调用 sort 时,您实际上最终将其转换为键/值对数组,然后对每个键/值对进行排序:

b.sort
# => [[:x, "1"], [:y, "2"]]

如果需要,您可以将其转换回 Hash:

b.sort.to_h
# => {:x=>"1", :y=>"2"}

所以现在它被正确地“排序”了。但实际上这并不重要,因为您将根据需要单独访问 key 。 b[:x] 不关心 :x 键在哪里,不管它总是返回正确的值。

关于 Ruby 的一些注意事项:

  • 不要使用 Hash.new,而是使用 { } 来表示一个空的 Hash 结构。
  • 不要对变量使用大写字母,它们在 Ruby 中具有重要意义。 Travel_Plans 是常量,不是变量,因为它以大写字母开头。这些保留给 ClassNameCONSTANT_NAME 类型使用。这应该是 travel_plans

关于ruby - 使用 HashMap 测试顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52862024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com