红宝石菜鸟在这里....
我一直在关注哈希数组太久了。
我需要像这样转换一个数组......
myArray = ["X", "X", "O", "O", "O", "+", "+", "O", "X"]
变成……像这样的哈希……</p>
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"]
变成……像这样的哈希……</p>
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"]
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}
我假设你想要一个数组,而不是一个哈希
["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}
看起来你想以某种方式处理数组中每个元素的位置
可以通过以下方式实现:
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
}
这一切都是有道理的,但这实际上取决于您要解决的问题。正如其他人所建议的那样,您也可以反转使整数成为您的密钥的顺序。
指数的解决方案:
h = Hash.new
arr.each_with_index{|x,i|
h[i] = x
}
希望任何解决方案都可能有效,但对于未来,请尝试更多地了解您想要解决的问题。