我想将更多数组推入此哈希?
I want to push more arrays into this Hash?
我想把数组压入这部分,我是Ruby
的新手
@edge_weights = {[position, position2] => node_distance}
那是哈希?我想我想以相同的方式推送一些其他哈希以获得这样的结果:
{["1", "2"]=>2445, ["2", "3"]=>2015, ["2", "4"]=>1547, ["3", "4"]=>939, ["5", "1"]=>1548}
不是这样的:
{["1", "2"]=>111},{["2", "3"]=>222},{["1", "3"]=>333}
我怎样才能做到这一点?。抱歉我的英语不好:(
大概您将从一些数据开始,例如以下数组:
arr = [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]
第一步是创建一个空哈希:
h = {}
现在遍历 arr
的元素以构建散列 h
。
arr.each do |a|
*first, last = a
h[first] = last
end
#=> [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
# ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]
我们要h
的值,而不是上面的return值。
h #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
# ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}
注意 Ruby 的 splat 运算符1 用于以各种方式分解数组:
*first, last = ["5", "1", "7", 1548]
first
#=> ["5", "1", "7"]
last
#=> 1548
以上 h
的结果是否符合您的预期?回想一下,散列具有唯一键。 arr
的第一个元素传递给我们执行的块后
h[["1", "2"]] = 2445
这样 h
就变成了 { ["1", "2"]=>2445 }
。稍后,当 arr
的最后一个元素——具有相同键值 (["1", "2"]
)——传递给块时,我们执行
h[["1", "2"]] = -71
覆盖那个键的值。如果您希望保留遇到的 first 键的值,您可以编写
arr.each do |a|
*first, last = a
h[first] = last unless h.key?(first)
end
参见 Hash#key?(又名 has_key?
和 include?
)。 (另外:你可以写 ...if !h.key?(first)
,!
读作 而不是 ,但通常更清楚地使用 unless
来避免取反。)
写原始构造的"Ruby way"是使用方法Enumerable#each_with_object和splat块变量a
:
arr.each_with_object({}) do |(*first, last),h|
h[first] = last
end
#=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
# ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}
这避免了需要使用单独的语句来创建空哈希和代码块 returns h
的值。
(看不懂也不用担心)
构造散列的另一种常用方法是使用方法 Hash#update(又名 merge!
):
arr.each_with_object({}) do |(*first, last),h|
h.update({ first=>last })
end
注意 Ruby 允许第二行的 shorthand 版本:
h.update(first=>last)
1 参见 "Multiple variable assignment" here。
您可以将数组作为 key
传递并为其分配 value
:
> edge_weights = {}
> edge_weights[["1","2"]] = 2445
> edge_weights[["2", "4"]] = 1547
> edge_weights
#=> {["1", "2"]=>2445, ["2", "4"]=>1547}
我想把数组压入这部分,我是Ruby
的新手@edge_weights = {[position, position2] => node_distance}
那是哈希?我想我想以相同的方式推送一些其他哈希以获得这样的结果:
{["1", "2"]=>2445, ["2", "3"]=>2015, ["2", "4"]=>1547, ["3", "4"]=>939, ["5", "1"]=>1548}
不是这样的:
{["1", "2"]=>111},{["2", "3"]=>222},{["1", "3"]=>333}
我怎样才能做到这一点?。抱歉我的英语不好:(
大概您将从一些数据开始,例如以下数组:
arr = [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]
第一步是创建一个空哈希:
h = {}
现在遍历 arr
的元素以构建散列 h
。
arr.each do |a|
*first, last = a
h[first] = last
end
#=> [["1", "2", 2445], ["2", "3", 2015], ["2", "4", 1547],
# ["3", "4", 939], ["5", "1", "7", 1548], ["1", "2", -71]]
我们要h
的值,而不是上面的return值。
h #=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
# ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}
注意 Ruby 的 splat 运算符1 用于以各种方式分解数组:
*first, last = ["5", "1", "7", 1548]
first
#=> ["5", "1", "7"]
last
#=> 1548
以上 h
的结果是否符合您的预期?回想一下,散列具有唯一键。 arr
的第一个元素传递给我们执行的块后
h[["1", "2"]] = 2445
这样 h
就变成了 { ["1", "2"]=>2445 }
。稍后,当 arr
的最后一个元素——具有相同键值 (["1", "2"]
)——传递给块时,我们执行
h[["1", "2"]] = -71
覆盖那个键的值。如果您希望保留遇到的 first 键的值,您可以编写
arr.each do |a|
*first, last = a
h[first] = last unless h.key?(first)
end
参见 Hash#key?(又名 has_key?
和 include?
)。 (另外:你可以写 ...if !h.key?(first)
,!
读作 而不是 ,但通常更清楚地使用 unless
来避免取反。)
写原始构造的"Ruby way"是使用方法Enumerable#each_with_object和splat块变量a
:
arr.each_with_object({}) do |(*first, last),h|
h[first] = last
end
#=> {["1", "2"]=>-71, ["2", "3"]=>2015, ["2", "4"]=>1547,
# ["3", "4"]=>939, ["5", "1"]=>1548, ["5", "1", "7"]=>1548}
这避免了需要使用单独的语句来创建空哈希和代码块 returns h
的值。
(看不懂也不用担心)
构造散列的另一种常用方法是使用方法 Hash#update(又名 merge!
):
arr.each_with_object({}) do |(*first, last),h|
h.update({ first=>last })
end
注意 Ruby 允许第二行的 shorthand 版本:
h.update(first=>last)
1 参见 "Multiple variable assignment" here。
您可以将数组作为 key
传递并为其分配 value
:
> edge_weights = {}
> edge_weights[["1","2"]] = 2445
> edge_weights[["2", "4"]] = 1547
> edge_weights
#=> {["1", "2"]=>2445, ["2", "4"]=>1547}