使用Ruby查找X文件中的公共行

使用Ruby查找X文件中的公共行,ruby,matching,Ruby,Matching,现在我有3个文件,但我想这样做的方式,我可以添加更多以后。每个文件都是一个ID列表,如下所示 174535945 174538045 160515924 81712260 25241494 我希望输出是列表1和列表2、列表2和列表3中出现的项目,以及列表1、列表2和列表3中出现的项目 最具ruby风格的方法是为每个列表创建一个带有键的散列,然后获取所有键并对所有散列进行测试,还是有一个很好的gem可以帮助实现这一点 谢谢,使用集合: require 'set' list_1 = open(fi

现在我有3个文件,但我想这样做的方式,我可以添加更多以后。每个文件都是一个ID列表,如下所示

174535945 174538045 160515924 81712260 25241494

我希望输出是列表1和列表2、列表2和列表3中出现的项目,以及列表1、列表2和列表3中出现的项目

最具ruby风格的方法是为每个列表创建一个带有键的散列,然后获取所有键并对所有散列进行测试,还是有一个很好的gem可以帮助实现这一点

谢谢,

使用集合:

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]

这正是我想要的,但仍在学习ruby api/库。谢谢如果你想把它扩展到任意数量的文件,你需要重新学习离散数学,或者使用有经验的人提供的库。这将是一个很好的工具。