【问题标题】:Using Ruby to Find Common Lines in X files使用 Ruby 查找 X 文件中的公共行
【发布时间】:2010-08-05 03:05:01
【问题描述】:

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

174535945 174538045 160515924 81712260 25241494

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

最红宝石的方法是为每个列表创建一个带有一个键的哈希,然后获取所有键并针对所有哈希进行测试,还是有一个很好的 gem 可以帮助解决这个问题?

谢谢,

【问题讨论】:

    标签: ruby matching


    【解决方案1】:

    使用集:

    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
    

    【讨论】:

    • 正是我想要的,但仍在学习 ruby​​ api/libraries。谢谢!
    • 如果你想让它扩展到任意数量的文件,你需要复习你的离散数学,或者使用来自某人的库。 frottage.org/rjp/ruby/combo.html 将是一个很好的构建工具。
    【解决方案2】:

    我认为您使用哈希的建议是可行的方法:

    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]
    

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多