如何在ruby中将数组转换为具有键值对的哈希

如何在ruby中将数组转换为具有键值对的哈希,ruby,Ruby,我是鲁比·努布 我在哈希表和数组中担任主角的时间太长了 我需要像这样转换一个数组 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} 我该怎么做 谢谢您的时间。我假设您想要的是数组,而不是散列 ["

我是鲁比·努布

我在哈希表和数组中担任主角的时间太长了

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

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}
我该怎么做


谢谢您的时间。

我假设您想要的是数组,而不是散列

["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]]

我假设您想要的是数组,而不是散列

["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]]

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}

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}

看起来您希望以某种方式处理数组中每个元素的位置

可通过以下方式实现:

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

看起来您希望以某种方式处理数组中每个元素的位置

可通过以下方式实现:

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

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

哈希不能有重复的键,因此“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
}
使用increment还可以销毁任何副本:

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
}

希望任何解决方案都能奏效,但为了将来,请尝试更多地讲述您想要解决的问题。

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

哈希不能有重复的键,因此“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
}
使用increment还可以销毁任何副本:

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
}
希望任何解决方案都能奏效,但为了将来,试着多讲一些你想解决的问题。

实际上,这可以做到:

实际上,这可以做到:


8是从哪里来的?不能有多个相同密钥的哈希。
myHash[“X”]
将返回什么?这是毫无意义的(顺便说一句,由于重复的键,这是不可能的)。将每个键的值设置为其在数组中的索引;你已经有这个了。它是您查找值的地址。你所要做的只是将其反转,原因是什么?如果所需的输出是
{“X”=>[0,1,8],“O”=>[2,3,4,7],“+”=>[5,6]}
这是有意义的。这不是不可能的,只是不太实用。8是从哪里得到的?不能有多个相同键的哈希。
myHash[“X”]
将返回什么?这是毫无意义的(顺便说一句,由于重复的键,这是不可能的)。将每个键的值设置为其在数组中的索引;你已经有这个了。它是您查找值的地址。你所要做的就是将其反转,原因是什么?如果所需的输出是
{“X”=>[0,1,8],“O”=>[2,3,4,7],“+”=>[5,6]}
这是有意义的。这不是不可能的,只是不太实用。让我们为尊重OP的问题和博学而听一听。:-)+1.让我们为尊重OP的问题和博学而听一听。:-)