【问题标题】:Matching Substrings in arrays匹配数组中的子字符串
【发布时间】:2016-07-03 12:46:16
【问题描述】:

我正在寻找一种可以检查数组中字符串的前 n 个字符是否相同的小方法。

例如:

["Marseille", "Marsan", "Martin"].method(3) => true
["Mar", "Mar", "Mar"]
["Marseille", "Marsan", "Martin"].method(4) => false
["Mars", "Mars", "Mart"]

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    更短的版本是使用带有块的Array#uniqEnumerable#one?

    class Array
      def same_prefix?(n)
        uniq{|x| x[0, n]}.one?
      end
    end
    

    Demonstration

    【讨论】:

    • @CarySwoveland:这是一个纯红宝石解决方案,看看链接。
    • 我不知道Enumerable#one?。很高兴知道。
    【解决方案2】:

    使用Array#map获取前缀数组:

    ["Marseille", "Marsan", "Martin"].map { |x| x[0,4] }
    # => ["Mars", "Mars", "Mart"]
    

    Array#uniq 删除重复项。

    ["Marseille", "Marsan", "Martin"].map { |x| x[0,4] }.uniq
    # => ["Mars", "Mart"]
    

    如果所有前缀都相同,则结果应该是单个项目的数组。


    class Array
      def same_prefix?(n)
        self.map { |x| x[0, n] }.uniq.size == 1
      end
    end
    
    ["Marseille", "Marsan", "Martin"].same_prefix?(3)
    # => true
    ["Marseille", "Marsan", "Martin"].same_prefix?(4)
    # => false
    

    【讨论】:

    • 为什么在将这个方法添加到Array 之后还要添加:same_prefix?
    • @Adobe,它是从 irb 会话中复制的。我忘了删除它。谢谢你的指点。
    【解决方案3】:
    class Array
      def same_start?(n)
        start = first[0,n]
        all? { |e| e[0,n] == start }
      end
    end
    
    ["Marseille", "Marsan", "Martian"].same_prefix?(3) #=> true
    ["Marseille", "Marsan", "Martian"].same_prefix?(4) #=> false
    

    【讨论】:

      【解决方案4】:

      这里还有另一种方法:

      arr = ["Marseille", "Marsan", "Martin"]
      n = 3
      arr.each_cons(2).all? {|s1, s2| s1[0...n] == s2[0...n]}
      #=> true
      

      轻微的变化可以是:

      arr.map{|s| s[0...n]}.each_cons(2).all? {|s1, s2| s1 == s2}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-27
        • 2015-07-16
        • 2021-08-25
        • 1970-01-01
        • 2022-10-14
        • 2016-01-15
        • 2013-09-16
        • 2014-02-08
        相关资源
        最近更新 更多