Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中数组的散列_Ruby_Arrays_Hash - Fatal编程技术网

Ruby中数组的散列

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

我有一个散列,其中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 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:NilClass
hash1.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