为什么我的哈希自动排序?

时间:2011-08-15 14:09:54

标签: ruby-on-rails ruby arrays hash

我最初做的实际问题是将数组的哈希值转换为哈希数组。如果有人对转换有任何意见,那么这很好,但实际问题是为什么哈希键的顺序在编辑后会发生变化。

我完全清楚这个问题,但这不是重复。事实上,我只是按照他们出来的顺序进行特定的调整。

我有一个数组和一个哈希。

数组(@headers)包含一个键列表。 @contents是一个填充数组的哈希。如上所述,我的任务是获得一个哈希数组。所以这是我的代码,非常简单。

@headers = (params[:headers])
puts "ORIGINAL PARAMS"
puts YAML::dump(@headers)


 @contentsArray = []  #The purpose of this is to contain hashes of each object

    @contents.each_with_index do |page,contentIndex|
      @currentPage = Hash.new

      @headers.each_with_index do |key, headerIndex|
        @currentPage[key] ="testing"
      end
      puts YAML::dump(@currentPage)
      @contentsArray[contentIndex] =@currentPage
    end
    puts "UPDATED CONTENTS"
    puts YAML::dump(@contentsArray[0])

这是我无法绕过头来的。原始参数的键与更新的键的顺序不同。

注意:放置“ORIGINAL PARAMS”&提出“更新内容”部分。这是他们的输出:

ORIGINAL PARAMS
--- 
- " Page Title      "
- " WWW "
- " Description     "
- " Keywords        "
- " Internal Links  "
- " External Links  "
- " Content files   "
- " Notes           "
--- 


UPDATED CONTENTS
--- 
" WWW ": page
" Internal Links  ": testing
" External Links  ": testing
" Description     ": testing
" Notes           ": testing
" Content files   ": testing
" Page Title      ": testing
" Keywords        ": testing

为什么会这样?

记录。在标题循环后打印@currentPage给出:

" WWW ": page
" Internal Links  ": page
" External Links  ": page
" Description     ": page
" Notes           ": page
" Content files   ": page
" Page Title      ": page
" Keywords        ": page

所以它必须是将值和键分配给@currentPage的方式,而不是当它进入数组时。

2 个答案:

答案 0 :(得分:4)

在Ruby 1.8+中,哈希是UNSORTED列表

  

您通过键或值遍历散列的顺序可能看起来是任意的,通常不会处于插入顺序。

在RUBY 1.9+中,它们按照您推送物品的方式进行分类。

  

哈希按照插入相应键的顺序枚举其值。

http://apidock.com/ruby/v1_9_2_180/Hash

答案 1 :(得分:2)

这是因为Ruby的Hash类型在内部使用哈希表数据结构,哈希表不跟踪其元素的顺序。

Ruby1.9的Hash使用链接的哈希表,跟踪其元素的序列。

所以在Ruby1.8中哈希是未排序的,并且在Ruby1.9哈希中进行了排序。