Arrays 如何从哈希键构建新的Ruby数组
我想从以下格式的散列开始构建一个新数组:Arrays 如何从哈希键构建新的Ruby数组,arrays,ruby,hash,Arrays,Ruby,Hash,我想从以下格式的散列开始构建一个新数组: HashConst = {[120,240] => 60, [240,480]=> 30} #Constant 我需要构建一个新数组,并按以下格式将值赋给一个新常量: [ [[120,240] ,1], [[240,480], 1] ] 我试过: NewArrayConst = HashConst.keys.each{ |res| [res, 1]} 但我得到的是 [ [120,240], [240,480] ] 我找到的唯一解决方案
HashConst = {[120,240] => 60, [240,480]=> 30} #Constant
我需要构建一个新数组,并按以下格式将值赋给一个新常量:
[ [[120,240] ,1], [[240,480], 1] ]
我试过:
NewArrayConst = HashConst.keys.each{ |res| [res, 1]}
但我得到的是
[ [120,240], [240,480] ]
我找到的唯一解决方案是:
tempVar = []
HashConst.keys.each_with_index{ |res,idx| tempVar [idx] = [res, 1]}
NewArrayConst = tempVar
任何人都知道一个更好的解决方案,并且可以解释为什么我无法从NewArrayConst=HashConst.keys.each{res}[res,1]}
获得预期的输出。我正在使用2.2.2-p95
编辑:
正如许多人指出的那样,Hash-var名称是错误的和误导性的,我已经更新了,为了避免混淆,您需要使用
map
,而不是每个
方法不返回在块中执行的代码的结果,而是只返回调用每个
的数组,在您的情况下,该数组是hash.keys
的值
将块返回的值收集到数组中
hash = {[120,240] => 60, [240,480]=> 30}
p array = hash.keys.map{ |res| [res, 1]}
#=> [[[120, 240], 1], [[240, 480], 1]]
注意:不要命名变量Hash
,因为它在Ruby中已经是一个众所周知的类。如果需要,请使用小写字母哈希
。此外,对于变量名,如NewArrayConst
,请避免使用驼峰大小写,因为Ruby建议使用snake\u case
来命名变量-您可以参考更多详细信息。您需要使用map
而不是每个
方法不返回在块中执行的代码的结果,而是只返回调用每个
的数组,在您的情况下,该数组是hash.keys
的值
将块返回的值收集到数组中
hash = {[120,240] => 60, [240,480]=> 30}
p array = hash.keys.map{ |res| [res, 1]}
#=> [[[120, 240], 1], [[240, 480], 1]]
注意:不要命名变量Hash
,因为它在Ruby中已经是一个众所周知的类。如果需要,请使用小写字母哈希
。另外,对于变量名,如NewArrayConst
,请避免使用驼峰大小写,因为Ruby建议使用snake\u case
来命名变量-您可以参考更多详细信息。您是否尝试过散列?有时候事情比你想象的要容易。你有没有尝试过散列。要_a
?有时候事情比你想象的要简单。这很有效,谢谢你的解释。我错误地认为每个人都收集并返回了执行的expression@mgtemp在什么意义上?我的意思是,如果你需要创建一个新数组,你需要创建一个新数组。@mgtemp与什么相比?这里有一个校对链接就好了。Hash
是一个“著名”的类吗?从来没有听说过。@CarySwoveland可能应该命名为Hush
,这很有效,谢谢你的解释。我错误地认为每个人都收集并返回了执行的expression@mgtemp在什么意义上?我的意思是,如果你需要创建一个新数组,你需要创建一个新数组。@mgtemp与什么相比?这里有一个校对链接就好了。Hash
是一个“著名”的类吗?从来没有听说过。@CarySwoveland可能它应该被命名为Hush
你为什么不把它留给@maza。to_a给了我们“[[120,240],60],[240,480],30]]”,这是@maza描述的格式。但不是他们真正想要的。我看不出有什么混乱。像往常一样,@Dave很挑剔。你为什么不让@maza来决定呢。to_a给了我们“[[[120240],60],[240480],30]]”,这是@maza描述的格式。但不是他们真正想要的。我看不出有什么混乱。像往常一样,@Dave很挑剔。你使用的正是类散列。重新定义它是一个糟糕的想法。您正在使用的正是类散列。重新定义它是一个糟糕的想法。这样做的好处是“提前”知道生成的结构有多大,因此,如果像mgtemp建议的那样在映射过程中涉及内存重新分配,它们可能是可以避免的。这样做的好处是“提前”知道生成的结构有多大,因此,如果像mgtemp建议的那样,在映射过程中涉及内存重新分配,那么它们可能是可以避免的。
h = {[120,240] => 60, [240,480]=> 30}
val = 1
h.keys.product([val])
#=> [[[120, 240], 1], [[240, 480], 1]]