以随机顺序放置ruby哈希

时间:2011-03-29 14:58:33

标签: ruby arrays hash zip

我编写了一个代码,将字母表中的每个字母与另一个字符(长度为1的字符串)相匹配,然后我将这两个字母转换成哈希:

Hash[String.alphabet.zip String.alphabet]
# String.alphabet returns an array with 0:A, 1:B, ... ,25:Z
# I take two times the alphabet to demonstrate

但是当我用

打印哈希时
puts "#{hash.keys.join}\n#{hash.values.join}"

它给了我

VKWLAXMBYNCZODPEQFRGSHTIUJ
VKWLAXMBYNCZODPEQFRGSHTIUJ

,这是 - 虽然是正确的 - 如果我想看看字母是否正确匹配,很难阅读,我更喜欢

形式的输出
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ

[打印方法在其他哈希上正常工作,据我所知是正确的]

那么:如何在保持原始键顺序的同时“压缩”数组?

3 个答案:

答案 0 :(得分:3)

您可以在Ruby 1.9.x中使用的已分类哈希值。在Ruby 1.8.7中,哈希是无内容的

来自API:

Hash是键值对的集合。它类似于Array,除了索引是通过任何对象类型的任意键完成的,而不是整数索引。您通过键或值遍历散列的顺序可能看起来是任意的,并且通常不会处于插入顺序中。

答案 1 :(得分:3)

关于有序哈希的答案是正确的,但在你的情况下,你不一定要按顺序保持哈希,你可以只为你的输出排序。

puts hash.sort.transpose.map(&:join)

答案 2 :(得分:1)

这不是zip,而是Hash问题。

一般的哈希表(在计算机科学的一般领域中)并不跟踪数据插入的顺序(或任何其他排序顺序)所有它想知道的是查找。如果要遍历哈希表以查看其中的所有内容,最终将按存储元素的存储区的顺序遍历元素。这通常是散列函数的一些模数。使用良好的哈希函数,这实际上是一个随机顺序。

在Ruby 1.8中,这就是哈希表的实现方式。

意识到人们希望他们的哈希记住元素的顺序,Ruby开发人员在Ruby 1.9的哈希表中添加了某种链表,这样你就可以以非随机的顺序遍历元素。