1

ハッシュ内の値を別のキーに再マッピングする方法について、Ruby のアドバイスはありますか? 私はこれを持っていると言う

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85} 

これを取得したかった (つまり、"present","first" と "subject","second" の値が入れ替わっている):

to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

大規模なデータセットでこれを行いたい。

4

5 に答える 5

3
# this is your starting hash:
from = {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
# this is your replacement mapping:
map = {'present' => 'first', 'subject' => 'second'}
# create complete map by inverting and merging back
map.merge!(map.invert)
# => {"present"=>"first", "subject"=>"second", "first"=>"present", "second"=>"subject"} 
# apply the mapping to the source hash:
from.merge(map){|_, _, key| from[key]}
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}
于 2011-08-04T12:45:57.247 に答える
2

十分なコンテキストを提供していませんが、次のようなことができます

 to = Hash[from.keys.zip(from.values_rearranged_in_any_way_you_like)]

編集:必要な方法でソートさfrom.values_rearranged_in_any_way_you_likeれるはずです(再配置のためにそれらをソートする望ましい方法があると思います)。from.values

于 2011-08-04T08:00:02.933 に答える
0

次のようなことができます。

keys = @hash.keys
values = @hash.values

次に、「値」配列(または「キー」配列)のエントリを交換できます

values[0], values[4] = values[4], values[0]

...

または、em を 1 項目だけ上にシフトしたい場合は、次のようにします。

values.rotate (ruby 1.9)

プッシュ/ポップ、シフト/シフト解除操作を実行したり、値を並べ替えたりすることもできます。ハッシュを作成するには、次のようにします。

hsh = Hash.new
keys.size.times do |i|
  hsh[ keys[i] ] = values[i]
end
于 2011-08-04T07:25:08.010 に答える
0

シンプルにして、マージを使用します。

from => {"first"=>30, "wanted"=>27, "second"=>45, "subject"=>68, "present"=>85}
to => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

from.merge(to)
# => {"first"=>85, "wanted"=>27, "second"=>68, "subject"=>45, "present"=>30}

ただし、ルビーで巨大なハッシュを再マッピングする必要があるかどうかはわかりません。

于 2011-08-04T11:54:35.570 に答える
0

さて、ここに簡単な小さなアルゴリズムがあります。それがどれほど効率的かはわかりませんが、うまくいくはずです。

class Hash
    def swap_vals!(new_key_maps)
        new_key_maps.each do |key1, key2|
            temp = self[key1]
            self[key1] = self[key2]
            self[key2] = temp
        end
    end
end
于 2011-08-04T07:29:21.003 に答える