2017-02-10 6 views
-1

У меня есть следующий входной .txt файл:Hash с несколькими значениями

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 

EDIT: код работает, когда я определяю мой хэш следующим образом:

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"}> 
Смежные вопросы