如何确定一个数组是否有连续的相同元素?

4
例如,如果我有一个数组,比如说:
arr = ["HI","BYE","BYE","BYE"]

有没有一种方法可以让我知道数组中是否连续出现了“BYE”?

1个回答

12
您可以使用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"] 

Here are a few other ways of doing this:
使用 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

或者简单地遍历该数组:
arr.any? && (1..arr.size-1).any? { |i| arr[i] == arr[i-1] }
  #=> true

arr.any? 是为了防止 arr 为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接