Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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
Arrays 如何将集合或数组放入二维Ruby哈希中?_Arrays_Ruby_Hash_Set - Fatal编程技术网

Arrays 如何将集合或数组放入二维Ruby哈希中?

Arrays 如何将集合或数组放入二维Ruby哈希中?,arrays,ruby,hash,set,Arrays,Ruby,Hash,Set,我想创建一个二维散列来保存Ruby中的集合。我希望下面的代码包含四个不同的集合,并且能够在散列的第一个维度中列出键 require 'set' cities = Hash.new() cities['Europe'] = Hash.new(Set.new) cities['Asia'] = Hash.new(Set.new) cities['Europe']['Sweden'].add "Stockholm" cities['Europe']['Sweden'].add "Gothenbur

我想创建一个二维散列来保存Ruby中的集合。我希望下面的代码包含四个不同的集合,并且能够在散列的第一个维度中列出键

require 'set'

cities = Hash.new()
cities['Europe'] = Hash.new(Set.new)
cities['Asia'] = Hash.new(Set.new)

cities['Europe']['Sweden'].add "Stockholm"
cities['Europe']['Sweden'].add "Gothenburg"
cities['Europe']['Denmark'].add "Copenhagen"
cities['Europe']['Denmark'].add "Odense"

cities['Asia']['Japan'].add "Tokyo"
cities['Asia']['Japan'].add "Kyoto"
cities['Asia']['China'].add "Beijing"
cities['Asia']['China'].add "Shanghai"

p cities['Europe']
p cities['Asia']

p cities['Europe']['Sweden']
p cities['Asia']['Japan']
cities['Europe'] = {|hash, key| hash[key] = Set.new}
cities['Asia'] = {|hash, key| hash[key] = Set.new}
我得到以下输出:

{}
{}
#<Set: {"Stockholm", "Gothenburg", "Copenhagen", "Odense"}>
#<Set: {"Tokyo", "Kyoto", "Beijing", "Shanghai"}>
{}
{}
#
#
看起来散列和集合的底层实现相互干扰,我得到了这个不直观的结果。如果使用数组代替集合(即,将
Set.new
替换为
Array.new
并将
.add
替换为
.push
),我会得到相同的、不需要的结果


(Ruby版本:Ruby 2.3.1p112)

当执行
h=Hash.new(Set.new)
时,访问散列中不存在的键时返回的默认值将是
Set
的实例,这意味着共享同一组。您可以通过以下方式进行检查:

h = Hash.new(Set.new)
h["Sweden"] << "Stockholm"
# => #<Set: {"Stockholm"}>
h["Denmark"] << "Copenhagen"
# => #<Set: {"Stockholm", "Copenhagen"}>
h["Sweden"].object_id == h["Denmark"].object_id
# => true
您可以将它们组合在一起,以避免为每个大陆设置哈希:

cities = Hash.new do |continents, continent_name|
  continent_countries = Hash.new { |countries, country_name| countries[country_name] = Set.new }
  continents[continent_name] = continent_countries
end
cities["Europe"]["Sweden"] << "Stockholm"
cities["Europe"]["Denmark"] << "Copenhagen"
cities["Asia"]["Japan"] << "Tokyo"
cities["Asia"]["Japan"] << "Kyoto"
cities
# => {"Europe"=>{"Sweden"=>#<Set: {"Stockholm"}>, "Denmark"=>#<Set: {"Copenhagen"}>},
#  "Asia"=>{"Japan"=>#<Set: {"Tokyo", "Kyoto"}>}}
cities=Hash.new do |大陆|大陆|名称|
大陆国家=Hash.new{国家,国家名称{国家[国家名称]=Set.new}
大陆[大陆名称]=大陆国家
结束
城市[“欧洲”][“瑞典”]#,
#“亚洲”=>{“日本”=>}

当执行
h=Hash.new(Set.new)
时,访问散列中不存在的键时返回的默认值将是
Set
的实例,这意味着共享相同的集。您可以通过以下方式进行检查:

h = Hash.new(Set.new)
h["Sweden"] << "Stockholm"
# => #<Set: {"Stockholm"}>
h["Denmark"] << "Copenhagen"
# => #<Set: {"Stockholm", "Copenhagen"}>
h["Sweden"].object_id == h["Denmark"].object_id
# => true
您可以将它们组合在一起,以避免为每个大陆设置哈希:

cities = Hash.new do |continents, continent_name|
  continent_countries = Hash.new { |countries, country_name| countries[country_name] = Set.new }
  continents[continent_name] = continent_countries
end
cities["Europe"]["Sweden"] << "Stockholm"
cities["Europe"]["Denmark"] << "Copenhagen"
cities["Asia"]["Japan"] << "Tokyo"
cities["Asia"]["Japan"] << "Kyoto"
cities
# => {"Europe"=>{"Sweden"=>#<Set: {"Stockholm"}>, "Denmark"=>#<Set: {"Copenhagen"}>},
#  "Asia"=>{"Japan"=>#<Set: {"Tokyo", "Kyoto"}>}}
cities=Hash.new do |大陆|大陆|名称|
大陆国家=Hash.new{国家,国家名称{国家[国家名称]=Set.new}
大陆[大陆名称]=大陆国家
结束
城市[“欧洲”][“瑞典”]#,
#“亚洲”=>{“日本”=>}
问题是

cities['Europe'] = Hash.new(Set.new)
cities['Asia'] = Hash.new(Set.new)
。。。对于每个键,您将默认值设置为相同的对象(Hash.new的实例),并且该对象对于城市['Europe']的每个成员都是相同的对象。另外,使用
.add
并不会真正实例化散列键,只会将其添加到基础默认值

你可以用一个积木来代替,它会很好的工作。。。但是您需要明确地将缺省值存储在块中的散列中

require 'set'

cities = Hash.new()
cities['Europe'] = Hash.new(Set.new)
cities['Asia'] = Hash.new(Set.new)

cities['Europe']['Sweden'].add "Stockholm"
cities['Europe']['Sweden'].add "Gothenburg"
cities['Europe']['Denmark'].add "Copenhagen"
cities['Europe']['Denmark'].add "Odense"

cities['Asia']['Japan'].add "Tokyo"
cities['Asia']['Japan'].add "Kyoto"
cities['Asia']['China'].add "Beijing"
cities['Asia']['China'].add "Shanghai"

p cities['Europe']
p cities['Asia']

p cities['Europe']['Sweden']
p cities['Asia']['Japan']
cities['Europe'] = {|hash, key| hash[key] = Set.new}
cities['Asia'] = {|hash, key| hash[key] = Set.new}
奖金建议

您可以使用嵌套的hash.new块创建
城市
哈希,这样您就不需要为每个大陆显式创建哈希

cities = Hash.new{|hash,key| hash[key] = Hash.new{|country_hash, country| country_hash[country] = Set.new } }
给你

require 'set'

cities = Hash.new{|h,k| h[k] = Hash.new{|h, k| h[k] = Set.new}}

cities['Europe']['Sweden'].add "Stockholm"
cities['Europe']['Sweden'].add "Gothenburg"
cities['Europe']['Denmark'].add "Copenhagen"
cities['Europe']['Denmark'].add "Odense"

cities['Asia']['Japan'].add "Tokyo"
cities['Asia']['Japan'].add "Kyoto"
cities['Asia']['China'].add "Beijing"
cities['Asia']['China'].add "Shanghai"

p cities['Europe']
=> {"Sweden"=>#<Set: {"Stockholm", "Gothenburg"}>, "Denmark"=>#<Set: {"Copenhagen", "Odense"}>}
p cities['Asia']
=> {"Japan"=>#<Set: {"Tokyo", "Kyoto"}>, "China"=>#<Set: {"Beijing", "Shanghai"}>}

p cities['Europe']['Sweden']
=> #<Set: {"Stockholm", "Gothenburg"}>
p cities['Asia']['Japan']
=>#<Set: {"Tokyo", "Kyoto"}>
require'set'
cities=Hash.new{124; h,k{124; h[k]=Hash.new{124; h,k{124; h[k]=Set.new}
城市['欧洲]['瑞典].添加“斯德哥尔摩”
城市[“欧洲”][“瑞典”]。添加“哥德堡”
城市['欧洲]['丹麦].添加“哥本哈根”
城市['欧洲]['丹麦].添加“欧登塞”
城市['亚洲]['日本].添加“东京”
城市['亚洲]['日本].添加“京都”
城市['亚洲]['中国].添加“北京”
城市[“亚洲”][“中国”]。添加“上海”
p城市[“欧洲”]
=>{“瑞典”、“丹麦”=>}
p城市[“亚洲”]
=>{“日本”,“中国”=>}
p城市[‘欧洲’][‘瑞典’]
=> #
p城市[“亚洲”][“日本”]
=>#
问题是

cities['Europe'] = Hash.new(Set.new)
cities['Asia'] = Hash.new(Set.new)
。。。对于每个键,您将默认值设置为相同的对象(Hash.new的实例),并且该对象对于城市['Europe']的每个成员都是相同的对象。另外,使用
.add
并不会真正实例化散列键,只会将其添加到基础默认值

你可以用一个积木来代替,它会很好的工作。。。但是您需要明确地将缺省值存储在块中的散列中

require 'set'

cities = Hash.new()
cities['Europe'] = Hash.new(Set.new)
cities['Asia'] = Hash.new(Set.new)

cities['Europe']['Sweden'].add "Stockholm"
cities['Europe']['Sweden'].add "Gothenburg"
cities['Europe']['Denmark'].add "Copenhagen"
cities['Europe']['Denmark'].add "Odense"

cities['Asia']['Japan'].add "Tokyo"
cities['Asia']['Japan'].add "Kyoto"
cities['Asia']['China'].add "Beijing"
cities['Asia']['China'].add "Shanghai"

p cities['Europe']
p cities['Asia']

p cities['Europe']['Sweden']
p cities['Asia']['Japan']
cities['Europe'] = {|hash, key| hash[key] = Set.new}
cities['Asia'] = {|hash, key| hash[key] = Set.new}
奖金建议

您可以使用嵌套的hash.new块创建
城市
哈希,这样您就不需要为每个大陆显式创建哈希

cities = Hash.new{|hash,key| hash[key] = Hash.new{|country_hash, country| country_hash[country] = Set.new } }
给你

require 'set'

cities = Hash.new{|h,k| h[k] = Hash.new{|h, k| h[k] = Set.new}}

cities['Europe']['Sweden'].add "Stockholm"
cities['Europe']['Sweden'].add "Gothenburg"
cities['Europe']['Denmark'].add "Copenhagen"
cities['Europe']['Denmark'].add "Odense"

cities['Asia']['Japan'].add "Tokyo"
cities['Asia']['Japan'].add "Kyoto"
cities['Asia']['China'].add "Beijing"
cities['Asia']['China'].add "Shanghai"

p cities['Europe']
=> {"Sweden"=>#<Set: {"Stockholm", "Gothenburg"}>, "Denmark"=>#<Set: {"Copenhagen", "Odense"}>}
p cities['Asia']
=> {"Japan"=>#<Set: {"Tokyo", "Kyoto"}>, "China"=>#<Set: {"Beijing", "Shanghai"}>}

p cities['Europe']['Sweden']
=> #<Set: {"Stockholm", "Gothenburg"}>
p cities['Asia']['Japan']
=>#<Set: {"Tokyo", "Kyoto"}>
require'set'
cities=Hash.new{124; h,k{124; h[k]=Hash.new{124; h,k{124; h[k]=Set.new}
城市['欧洲]['瑞典].添加“斯德哥尔摩”
城市[“欧洲”][“瑞典”]。添加“哥德堡”
城市['欧洲]['丹麦].添加“哥本哈根”
城市['欧洲]['丹麦].添加“欧登塞”
城市['亚洲]['日本].添加“东京”
城市['亚洲]['日本].添加“京都”
城市['亚洲]['中国].添加“北京”
城市[“亚洲”][“中国”]。添加“上海”
p城市[“欧洲”]
=>{“瑞典”、“丹麦”=>}
p城市[“亚洲”]
=>{“日本”,“中国”=>}
p城市[‘欧洲’][‘瑞典’]
=> #
p城市[“亚洲”][“日本”]
=>#