2013-02-28 106 views
0

红宝石noob在这里....如何将数组转换为红宝石键值对哈希

我一直在哈希星阵列太久。

我需要转换这样一个数组...

myArray = ["X", "X", "O", "O", "O", "+", "+", "O", "X"] 

成......像这样的哈希...

myHash = {"X"=>0, "X"=>1, "O"=>2, "O"=>3, "O"=>4, "+"=>5, "+"=>6, "O"=>7, "X"=>8} 

我怎样才能做到这一点?

感谢您的时间。

+0

你从哪里得到8? – Linuxios 2013-02-28 14:36:12

+8

您不能拥有多个相同密钥的散列。 'myHash [“X”]'会返回什么? – harbichidian 2013-02-28 14:39:49

+1

这是毫无意义的(并且偶然不可能,由于重复的键)。您将每个键的值设置为其在数组中的索引;你*已经拥有这个*。这是你找到价值的地址。你所要做的只是颠倒它,出于什么原因? – meagar 2013-02-28 14:43:29

回答

4

其实这可以来完成:

myArray = ["X", "X", "O", "O", "O", "+", "+", "O", "X"] 
h = {}.compare_by_identity 
myArray.each_with_index{|k,v| h[k] = v} 
p h 

#=>{"X"=>0, "X"=>1, "O"=>2, "O"=>3, "O"=>4, "+"=>5, "+"=>6, "O"=>7, "X"=>8} 
+0

+1。让我们听到它尊重OP的问题,并知道是否知道。 :-) – 2013-07-18 16:14:24

0

我假设你想要一个数组,而不是一个哈希

["X", "X", "O", "O", "O", "+", "+", "O", "X"].each_with_index.map do |obj, i| 
    [obj,i] 
end 

=> [["X", 0], ["X", 1], ["O", 2], ["O", 3], ["O", 4], ["+", 5], ["+", 6], ["O", 7], ["X", 8]] 
0

harbichidian作出关于相同的密钥好点。为了让哈希从格式指定数组:

myArray = ["X", "X", "O", "O", "O", "+", "+", "O", "X"] 
myHash = {} 

(0...myArray.length).each do |i| 
    myHash[myArray[i]] = i 
end 

不过,既然你有重复键,这将导致:

{"X"=>8, "O"=>7, "+"=>6} 
0

貌似要与位置莫名其妙处理阵列中的每个元素的

可以用以下方式实现:

myHash = Hash.new 
myArray.each_with_index do |x,i| 
    myHash[i] = x 
end 

myHash: => {0=>"X", 1=>"X", 2=>"O", 3=>"O", 4=>"O", 5=>"+", 6=>"+", 7=>"O", 8=>"X"} 
+0

这也是如此。 – Jessi 2013-03-02 02:29:42

0

我相信你没有完全掌握Hashes,或者你只是想销毁任何重复的值。

散列不能有重复键,所以“X”不能occure两次意思是:你的哈希将错过所有的重复键的转换:

['X','X','Y'] -> {"X"=> 0, "Y"=>1} or {"X"=> 0, "Y"=>2} 

这就引出了另一个问题:你要使用索引或从零开始递增整数?

随着指数摧毁任何重复:

h = Hash.new 
arr.each_with_index {|x,i| if not h.has_key?(x) then h[x] = i;h} 

随着增量也摧毁任何重复:

h = Hash.new 
count = 0 
arr.each{|x| 
    if not h.has_key?(x) then 
    h[x] = count 
    count+=1 
} 

这一切都有道理,但它确实取决于你想解决的问题。正如其他人所建议的,你也可以将整数作为你的关键。

一种指数的解决方案:

h = Hash.new 
arr.each_with_index{|x,i| 
    h[i] = x 
} 

希望任何解决方案可能会奏效,但对未来的尝试告诉更多一点关于你想解决的问题。