我编写了一个代码,将字母表中的每个字母与另一个字符(长度为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
[打印方法在其他哈希上正常工作,据我所知是正确的]
那么:如何在保持原始键顺序的同时“压缩”数组?
答案 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的哈希表中添加了某种链表,这样你就可以以非随机的顺序遍历元素。