2017-02-10 155 views
-1

我有.txt文件下列輸入:哈希具有多個值

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

,我需要讓所有的唯一目的地的TO

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

,這樣我可以用另一個數組對它們進行比較看起來像這樣的字符串A = [「維也納」,「盧森堡」,「羅馬」]。

此解決方案不起作用。

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"] 
+0

沒有按什麼方面呢不工作? – splrs

+0

@splrs我不知道如何添加一個數組到一個散列鍵,因爲這一個替換值s.t. 「倫敦」只有最後的價值,在這種情況下,它是「巴黎」 –

回答

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"] 
} 
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"}>