对于Ruby哈希,一次将多个键设置为相同的值

时间:2015-10-31 07:28:20

标签: ruby hash

我正在尝试创建这个巨大的哈希值,其中有很多键但只有几个值。

到目前为止,我已经这样了......

Bad notification for startForeground: java.lang.ClassCastException: 
android.widget.RemoteViews$SetOnClickPendingIntent cannot be cast to 
android.widget.RemoteViews$ReflectionAction 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1260) 
android.os.Handler.dispatchMessage(Handler.java:99) 
android.os.Looper.loop(Looper.java:137) 
android.app.ActivityThread.main(ActivityThread.java:4424) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)   
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:592) 
dalvik.system.NativeStart.main(Native Method)

......等等,等等,甚至比你想知道的还要长。什么是更简洁,更优雅的方式来创建这个哈希而不完全翻转它的结构?

编辑:嘿,我意识到有一个更容易和更优雅的方式来做这个比给出的答案。只需声明一个空哈希,然后使用所需的键声明一些数组,然后使用for语句将它们插入到数组中,如下所示:

du_factor = {
  "A" => 1,
  "B" => 1,
  "C" => 1,
  "D" => 2,
  "E" => 2,
  "F" => 2,

...但事实上,没有人建议让我,极端的Ruby n00b,认为必须有一个原因,我不应该这样做。性能问题?

5 个答案:

答案 0 :(得分:3)

Ranges与案例块组合可能是另一种选择(取决于您尝试解决的问题):

case foo
when ('A'..'C') then 1
when ('D'..'E') then 2
# ...
end

特别是如果您专注于源代码的可读性。

答案 1 :(得分:0)

keys = %w(A B C D E F)
values = [1, 1, 1, 2, 2, 2]
du_factor = Hash[*[keys, values].transpose.flatten]

如果这些数据超过100,将其写入CSV文件可能会更好。

答案 2 :(得分:0)

keys = [%w(A B C), %w(D E F)]
values = [1,2] 
values.map!.with_index{ |value, idx| Array(value) * keys[idx].size }.flatten!
keys.flatten!
du_factor = Hash[keys.zip(values)]

请注意,我使用了破坏性方法(以!结尾的方法)。这对性能和内存使用优化很重要。

答案 3 :(得分:0)

怎么样:

vals_to_keys = {
  1 => [*'A'..'C'],
  2 => [*'D'..'F'],
  3 => [*'G'..'L'],
  4 => ['dog', 'cat', 'pig'],
  5 => [1,2,3,4]
}

vals_to_keys.each_with_object({}) { |(v,arr),h| arr.each { |k| h[k] = v } }
  #=> {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2, "F"=>2, "G"=>3, "H"=>3, "I"=>3,  
  #    "J"=>3, "K"=>3, "L"=>3, "dog"=>4, "cat"=>4, "pig"=>4, 1=>5, 2=>5, 3=>5, 4=>5}

答案 4 :(得分:0)

这样的事情:

du_factor = Hash.new
["A", "B", "C"].each {|ltr| du_factor[ltr] = 1}
["D", "E", "F"].each {|ltr| du_factor[ltr] = 2}

# Result:
du_factor # => {"A"=>1, "B"=>1, "C"=>1, "D"=>2, "E"=>2, "F"=>2}

创建一个空哈希,然后为共享一个值的每组键创建一个包含键的数组文字,并使用数组' .each'批量输入哈希的方法。基本上你用for循环做了同样的事情,但它完成了三行。