我正在尝试创建这个巨大的哈希值,其中有很多键但只有几个值。
到目前为止,我已经这样了......
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,认为必须有一个原因,我不应该这样做。性能问题?
答案 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循环做了同样的事情,但它完成了三行。