如何使用ruby中的键值对将数组转换为哈希值

时间:2013-02-28 14:35:25

标签: ruby

Ruby 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}

我该怎么做?

感谢您的时间。

5 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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]]

答案 2 :(得分: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}

答案 3 :(得分: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"}

答案 4 :(得分:0)

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

哈希不能有重复键,因此'X'不会出现两次意思:你的哈希会错过转换中的所有重复键:

['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
}

希望任何解决方案都可行,但对于未来,请尝试更多地了解您想要解决的问题。