你怎么知道一个数组是否有连续的元素是相同的?

Jor*_* Jr 3 ruby arrays sorting ruby-on-rails

例如,如果我有一个像这样的数组:

arr = ["HI","BYE","BYE","BYE"]
Run Code Online (Sandbox Code Playgroud)

有没有一种方法让我知道数组中有连续的"BYE"?

Car*_*and 11

你可以使用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
Run Code Online (Sandbox Code Playgroud)

要确定是否有任何连续元素相同:

arr.each_cons(2).any? { |s,t| s == t }
  #=> true
Run Code Online (Sandbox Code Playgroud)

注意:

enum = arr.each_cons(2)
  #=> #<Enumerator: ["HI", "BYE", "BYE", "BYE"]:each_cons(2)>
Run Code Online (Sandbox Code Playgroud)

可以通过将其转换为数组来获取此枚举器的元素:

enum.to_a
  #=> [["HI", "BYE"], ["BYE", "BYE"], ["BYE", "BYE"]]
Run Code Online (Sandbox Code Playgroud)

这三个元素enum依次传递给块并分配给块变量:

s, t = enum.next
  #=> ["HI", "BYE"] 
s #=> "HI"
t #=> "BYE"

s, t = enum.next
  #=> ["BYE", "BYE"] 

s, t = enum.next
  #=> ["BYE", "BYE"] 
Run Code Online (Sandbox Code Playgroud)

编辑:以下是其他几种方法:

使用Enumerable#slice_when(Ruby v2.2 +):

arr.slice_when { |a,b| a != b }.any? { |a| a.size > 1 }
  #=> true 
Run Code Online (Sandbox Code Playgroud)

或者Enumerable#chunk(Ruby v1.9.3 +)和Object#本身(Ruby v.2.2 +).

arr.chunk(&:itself).any? { |_,a| a.size > 1 }
  #=> true
Run Code Online (Sandbox Code Playgroud)