Почему мой хэш самосортируется? - PullRequest
2 голосов
/ 15 августа 2011

Реальная проблема, которую я первоначально делал, заключалась в преобразовании хэша массивов в массив хэшей. Если у кого-то есть какие-либо комментарии по выполнению преобразования, тогда это нормально, но на самом деле у меня возникает вопрос, почему порядок их изменения после редактирования изменяется.

Я полностью осведомлен об этом вопросе, но это не дубликат. На самом деле, у меня просто есть особая тема в том порядке, в котором они выходят.

У меня есть один массив и один хэш.

Массив (@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
--- 
- " 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 ]

4 голосов
/ 15 августа 2011

В Ruby 1.8+ хэши НЕПРАВИЛЬНЫЕ списки

Порядок, в котором вы проходите хеш по ключу или значению, может показаться произвольным и, как правило, не соответствует порядку вставки.

В рублях 1,9+ они сортируются, чтобы вы нажимали элементы.

Хеши перечисляют свои значения в порядке, в котором были вставлены соответствующие ключи.

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

2 голосов
/ 15 августа 2011

Это связано с тем, что тип хэша Ruby использует внутреннюю структуру данных хеш-таблицы, а хеш-таблицы не отслеживают порядок их элементов.

хэш Ruby1.9 использует связанную хеш-таблицу, которая отслеживаетот их элементов.

Таким образом, в Ruby1.8 хэши не сортируются, а в Ruby1.9 хэши сортируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...