【问题标题】:Position of key/value pairs in a hash in Ruby (or any language)Ruby(或任何语言)哈希中键/值对的位置
【发布时间】:2017-08-08 15:56:27
【问题描述】:

听说hash中键值对的位置不固定,可以重新排列。

我想知道这是否属实,如果是,有人可以指点我一些文档吗?如果是错误的,最好有一些相反的文档。

为了说明,如果我有以下哈希:

   NUMBERS = {
             1000 => "M",
             900 => "CM",
             500 => "D",
             400 => "CD",
             100 => "C",
             90 => "XC",
             50 => "L",
             40 => "XL",
             10 => "X",
             9 => "IX",
             5 => "V",
             4 => "IV",
             1 => "I",
           }

并一遍又一遍地遍历它,第一个键/值对可能不是1000 => 'M'?或者,键/值对的位置是否按定义固定,并且必须手动更改才能更改位置?

这个问题是关于哈希质量的更一般和基本的问题。我不是在问如何到达哈希中的某个位置。

【问题讨论】:

标签: ruby data-structures hash key hashtable


【解决方案1】:

通常哈希(或字典、关联数组等)被认为是无序的数据结构。

来自Wikipedia

此外,关联数组还可能包括其他操作,例如 作为确定绑定的数量或构造一个迭代器 循环遍历所有绑定。通常,对于这样的操作,顺序 返回绑定的位置可能是任意的。

然而,从 Ruby 1.9 开始,哈希键保持它们在 Ruby 中插入的顺序。

答案就在Ruby documentation for Hash上方

哈希按照对应键的顺序枚举它们的值 已插入。

在 Ruby 中你可以很容易地自己测试它

key_indices = {
  1000 => 0,
  900  => 1,
  500  => 2,
  400  => 3,
  100  => 4,
  90   => 5,
  50   => 6,
  40   => 7,
  10   => 8,
  9    => 9,
  5    => 10,
  4    => 11,
  1    => 12
}

1_000_000.times do
  key_indices.each_with_index do |key_val, i|
    raise if key_val.last != i
  end
end

【讨论】:

    【解决方案2】:

    散列(也称为关联数组)是一种无序的数据结构。 由于 Ruby 1.9 Ruby 保持插入键的顺序。

    您可以在这里找到更多相关信息:Is order of a Ruby hash literal guaranteed?

    还有一些https://ruby-doc.org/core-2.4.1/Hash.html

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 2011-06-30
      • 2014-02-20
      • 1970-01-01
      • 2021-05-25
      • 2013-12-06
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多