Используя Ruby, чтобы найти общие линии в файлах X

StackOverflow https://stackoverflow.com/questions/3408120

  •  25-09-2019
  •  | 
  •  

Вопрос

Прямо сейчас у меня есть 3 файла, но я хотел бы сделать это таким образом, чтобы я мог добавить больше позже. Каждый файл представляет собой список идентификаторов, как это.

174535945 174538045 160515924 81712260 25241494

Я хотел бы, чтобы вывод быть элементами, которые появляются в списке 1 и перечень 2, список 2 и списка 3, и те, которые происходят в списке 1 и списка 2 и список 3.

Будет ли самый Ruby Way создать хеш с ключом для каждого списка, а затем получить все ключи и тестировать против всех хэшей, или есть хороший драгоценный камень, который поможет с этим?

Спасибо,

Это было полезно?

Решение

Использовать наборы:

require 'set'

list_1 = open(filename_1).read.split.to_set
list_2 = open(filename_2).read.split.to_set
list_3 = open(filename_3).read.split.to_set

puts list_1 & list_2
puts list_2 & list_3
puts list_1 & list_2 & list_3

Другие советы

Я думаю, что ваше предложение об использовании хеша - это путь:

require 'set'

class Test
  def initialize()
    @lists = {174=>[1,2,3], 111=>[2,3,4], 160=>[2,4,5]}
  end

  def common_members(*keys)
    lists_as_sets = {}
    @lists.each_pair {|key,list| lists_as_sets[key] = list.to_set}
    common = lists_as_sets[keys.shift] # Set to key[0] and nil that element of keys
    keys.each {|k| common = common & lists_as_sets[k]} # Intersect the remaining keys, if any
    common.to_a
  end
end

t = Test.new
p t.common_members(174,111) # => [2,3]
p t.common_members(111,160) # => [2,4]
p t.common_members(174,111,160) # =>[2]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top