0

ここにRubynoob...。

私はあまりにも長い間、ハッシュ配列を主演してきました。

私はそのように配列を変換する必要があります...

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}

これどうやってするの?

御時間ありがとうございます。

4

5 に答える 5

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}
于 2013-02-28T15:52:51.637 に答える
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}
于 2013-02-28T14:46:48.517 に答える
0

ハッシュを完全に把握していないか、重複している値を破棄したいだけだと思います。

ハッシュは重複するキーを持つことができないため、「X」が2回発生することはありません。つまり、ハッシュは変換で重複するすべてのキーを見逃します。

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

どんな解決策でもうまくいくことを願っていますが、将来のためにあなたが解決したい問題についてもう少し話してみてください。

于 2013-02-28T15:02:52.250 に答える
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]]
于 2013-02-28T14:46:04.137 に答える
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"}
于 2013-02-28T14:49:35.863 に答える