具有多个值的哈希值

时间:2017-02-10 12:19:07

标签: ruby hash

我有以下输入.txt文件:

FROM       TO
London     Paris
London     NYC
NYC        Cairo
Cairo      Rome
London     Paris

我需要获得所有唯一目的地TOs

"London" -> ["Paris", "NYC"]
"NYC" -> ["Cairo]
"Cairo" -> ["Rome"]

这样我就可以将它们与另一个看起来像A = [“Vienna”,“Luxembourg”,“Rome”]的字符串数组进行比较。

此解决方案不起作用。

 h = Hash.new{|hash, key| hash[key]}
 lineCounter = 0
 file = File.open(arcFile2,"r")
 Line = file.first.split(" ")
 file.each_line do |line|
  if lineCounter == 0 then
  lineCounter = lineCounter + 1
  elsif lineCounter > 0 then
  Line = line.split("\t")
  from = Line[firstLine.index "from"].to_s.chomp
  to = Line[firstLine.index "to"].to_s.chomp
  h[from] = to
 end
end
puts h["London"] & A

编辑:当我将哈希定义如下时,代码有效:

h = Hash.new{|hash, key| hash[key] = Array.new}
h[from].push to

现在的问题是如何添加唯一值,因为在这种情况下我会有

"London" -> ["Paris", "NYC", "Paris"]

2 个答案:

答案 0 :(得分:0)

File.open(file).each_line.drop(1)
.map(&:split)
.group_by(&:first)
.map{|k, v| [k, v.map(&:last).uniq]}
# => [
  ["London", ["Paris", "NYC"]],
  ["NYC", ["Cairo"]],
  ["Cairo", ["Rome"]]
]

在Ruby 2.4中:

File.open(file).each_line.drop(1)
.map(&:split)
.group_by(&:first)
.transform_values{|v| v.map(&:last).uniq}
# => {
  "London" => ["Paris", "NYC"],
  "NYC" => ["Cairo"],
  "Cairo" => ["Rome"]
}

答案 1 :(得分:0)

回答您更新的问题:

  

现在的问题是如何添加唯一值?

您可以使用none?,如下所示:

h[from].push(to) if h[from].none? { |i| i == to }

还要考虑使用一个集合(只包含唯一元素)而不是数组:

require 'set'

set = Set.new ['a','b']
#=> #<Set: {"a", "b"}>
set << 'a'
#=> #<Set: {"a", "b"}>