2013-02-28 72 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 
} 

希望任何解決方案可能會奏效,但對未來的嘗試告訴更多一點關於你想解決的問題。