Ruby中数组的散列
我有一个散列,其中key是一个字符串,value是一个字符串数组。 我想要这样的东西:Ruby中数组的散列,ruby,arrays,hash,Ruby,Arrays,Hash,我有一个散列,其中key是一个字符串,value是一个字符串数组。 我想要这样的东西: {"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} 我只有一个散列和一个数组来实现这一点。我编写了如下代码: hash1 = Hash.new arr = Array.new arr.push "v1" arr.push "v2" hash1["k1"] = arr #hash is like this: {"k1"=>["v1", "v2"] #Now
{"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]}
我只有一个散列和一个数组来实现这一点。我编写了如下代码:
hash1 = Hash.new
arr = Array.new
arr.push "v1"
arr.push "v2"
hash1["k1"] = arr
#hash is like this: {"k1"=>["v1", "v2"]
#Now I clear the array to read the new values
arr. clear
arr.push "v3"
arr.push "v4"
hash1["k2"] = arr
puts hash1
#Output: {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]}
#Notice that k1's value also got updated
然后我换了一行:
hash1 = Hash.new
arr = Array.new
arr.push "v1"
arr.push "v2"
hash1["k1"] = arr
arr = [] # ** This is the only changed line. Now k1's value is correct. **
arr.push "v3"
arr.push "v4"
hash1["k2"] = arr
puts hash1
#Output: {"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} (which I wanted)
有人能解释一下这是怎么发生的吗?我对Ruby很陌生。理想情况下,对这个问题进行编码的正确方法是什么?您保存在哈希表上的数组仍然被
arr
引用,因此显然,执行arr.clear
和使用arr.push
将清理并向保存在哈希表上的数组添加新值。但是,执行arr=[]
,arr
现在将引用一个新数组,该数组与散列中保存的数组不同
您只需添加一个新数组到散列,方法如下:
hash1["k2"] = ["v3", "v4"]
或
这应该告诉你发生了什么(是你的朋友)。(我在对象_id中插入了下划线,以便于查看差异。)
hash1={}
arr=[“v1”,“v2”]#=>[“v1”,“v2”]
arr.object_id#=>7016637_4343580
hash1[“k1”]=arr#=>[“v1”,“v2”]
hash1#=>{“k1”=>[“v1”,“v2”]}
hash1[“k1”]。对象id#=>7016637_4343580
arr.clear#=>[]
arr.object_id#=>7016637_4343580
arr 7016637_4343580
hash1[“k2”]=arr#=>[“v3”,“v4”]
hash1#=>{“k1”=>[“v3”,“v4”],“k2”=>[“v3”,“v4”]}
hash1[“k1”]。对象id#=>7016637_4343580
hash1[“k2”]。对象id=>7016637\u 4166580
arr=[].=>[]
arr.object_id#=>7016637_4036500
arr=[“v5”、“v6”]#=>[“v5”、“v6”]
arr.object_id#=>7016637_3989880
hash1#=>{“k1”=>[“v3”,“v4”],“k2”=>[“v3”,“v4”]}
hash1[“k1”]。对象id#=>7016637_4343580
hash1[“k2”]=arr#=>[“v5”,“v6”]
hash1#=>{“k1”=>[“v3”,“v4”],“k2”=>[“v5”,“v6”]}
hash1[“k1”]。对象id#=>7016637_4343580
hash1[“k2”]。对象id=>7016637\u 3989880
“我只有一个哈希和一个数组来实现它。”在第二个示例中没有。这里有两个数组。{}
几乎总是比哈希更可取。new
和[]
更可取数组。new
@tadman为什么更可取?这只是为了可读性吗?或者还有其他好处吗?@AnirudhanJ表示法更简洁,更不容易出错。它还可以方便地在以后添加元素,其中{}
变成{foo:'bar'}
,而不必从Hash.new
切换到该值。添加到答案以便您可以看到它工作,在arr
上执行此操作,arr.object\u id
,您将收到一个数字,当您使用清除
并再次检查id时,它是相同的(仍然是相同的引用),当您使用arr=[]
创建具有相同名称的新对象时,覆盖旧对象,使用arr.object\u id
检查它,您将有一个不同的id号,这意味着,一个新对象:)很好的解释。如果我想用值v1或v2对哈希进行排序,我应该怎么做hash1.sort_by{k,v | v.first}
#未定义的方法“[]”对于nil:NilClasshash1.sort_by{k,v | v[0]}
#未定义的方法“[]”对于nil:NilClass我不太理解你的问题。请留下一个注释,例如“代码”> HAS1和您想得到的哈希数组的结果。考虑这样的哈希数组[{“a”=>(576, 236)},{“z”=>(348, 4859)},{“B”=>(174, 98)},{“T”=> [165, 145 ] },{“U”=> [97, 184 ] },{“M”=> [595, 374 ] },{“G”=> [61, 86 ] }。如何使用每个键的值之和对哈希数组进行排序?像这样,{code>[{z=>[3484859]},{a=>[576236]},{m=>[595374]},{t=>[165145]},{u=>[97184]},{b=>[17498]},{g=>[61,86]}@h.APP y先按最大和排序:arr.sort.\u按{h}-h.values排序。首先,减少(
。你能再解释一下吗。我想知道它是怎么工作的
hash1["k2"] = %w[v3 v4]
hash1 = {} # => {}
arr = ["v1", "v2"] # => ["v1", "v2"]
arr.object_id # => 7016637_4343580
hash1["k1"] = arr # => ["v1", "v2"]
hash1 # => {"k1"=>["v1", "v2"]}
hash1["k1"].object_id # => 7016637_4343580
arr.clear # => []
arr.object_id # => 7016637_4343580
arr << "v3" << "v4" # => ["v3", "v4"]
arr.object_id # => 7016637_4343580
hash1["k2"] = arr # => ["v3", "v4"]
hash1 # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]}
hash1["k1"].object_id # => 7016637_4343580
hash1["k2"].object_id # => 7016637_4166580
arr = [] # => []
arr.object_id # => 7016637_4036500
arr = ["v5", "v6"] # => ["v5", "v6"]
arr.object_id # => 7016637_3989880
hash1 # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]}
hash1["k1"].object_id # => 7016637_4343580
hash1["k2"] = arr # => ["v5", "v6"]
hash1 # => {"k1"=>["v3", "v4"], "k2"=>["v5", "v6"]}
hash1["k1"].object_id # => 7016637_4343580
hash1["k2"].object_id # => 7016637_3989880