例如,如果我有一个类似的数组:
arr = ["HI","BYE","BYE","BYE"]
有没有一种方法让我知道数组中有连续的#BYE"?
答案 0 :(得分:9)
您可以使用Enumerable#each_cons:
arr = ["HI", "BYE", "BYE", "BYE"]
arr.each_cons(2).any? { |s,t| s == "BYE" && t == "BYE" }
#=> true
arr.each_cons(2).any? { |s,t| s == "HI" && t == "HI" }
#=> false
确定任何连续元素是否相同:
arr.each_cons(2).any? { |s,t| s == t }
#=> true
请注意:
enum = arr.each_cons(2)
#=> #<Enumerator: ["HI", "BYE", "BYE", "BYE"]:each_cons(2)>
可以通过将其转换为数组来获取此枚举器的元素:
enum.to_a
#=> [["HI", "BYE"], ["BYE", "BYE"], ["BYE", "BYE"]]
enum
的三个元素依次传递给块并分配给块变量:
s, t = enum.next
#=> ["HI", "BYE"]
s #=> "HI"
t #=> "BYE"
s, t = enum.next
#=> ["BYE", "BYE"]
s, t = enum.next
#=> ["BYE", "BYE"]
编辑:以下是其他几种方法:
使用Enumerable#slice_when(Ruby v2.2 +):
arr.slice_when { |a,b| a != b }.any? { |a| a.size > 1 }
#=> true
或Enumerable#chunk(Ruby v1.9.3 +)和Object#itself(Ruby v.2.2 +)。
arr.chunk(&:itself).any? { |_,a| a.size > 1 }
#=> true