用于检查数组是否包含有序(但可能是非连续)元素集的惯用方法

时间:2016-09-02 18:33:20

标签: ruby

我想知道是否有更惯用的方法来获得下面代码所代表的功能。基本上我只是想按照pattern指定的顺序检查数组是否包含pattern中的元素。这些元素之间存在差距是可以的。

class Array
  def has_pattern?(pattern)
    offset = 0
    pattern.each do |p|
      offset = self[offset..-1].index(p)
      return false if offset.nil?
    end
    return true
  end
end

puts [1, 2, 3, 4, 5, 1].has_pattern?([1, 4, 5]) # true
puts [1, 2, 3, 4, 5, 1].has_pattern?([2, 3, 1]) # true
puts [1, 2, 3, 4, 5, 1].has_pattern?([1, 3, 2]) # false

上面的代码似乎有用,但对我来说并不像惯用的Ruby。有没有更好的方式来写这个?

2 个答案:

答案 0 :(得分:2)

这是我的看法:

func calculation(operatorType: String, number1: Double, number2: Double) -> Double {

if operatorType == "+" {
    return number1 + number2

} else if operatorType == "-" {
    return number1 - number2

} else if operatorType == "/" {
    return number1 / number2

} else if operatorType == "*" {
    return number1 * number2

} else {
    return 0
 }
}

它只通过数组一次,所以当数组很大时它可能会有所不同。

答案 1 :(得分:1)

这是一种不同的方法:

class Array
  def has_pattern?(pattern)
    (self - (self - pattern))
      .each_cons(pattern.length)
      .any? { |p| p === pattern }
  end
end

但是,正如我在上面的评论中所说,我认为你的解决方案更胜一筹。