如果下一个元素不是一个加上当前元素,如何从数组中选择?

时间:2017-03-16 15:55:20

标签: arrays ruby

我想从我的数组中选择所有元素,使其后面的元素不是一个加上当前元素。

我试过了:

data_col = ["46", "47", "48", "49", "50", "51", "52"]
data_col.select.with_index{|string, index| data_col[index+1] && string.to_i != data_col[index+1].to_i + 1 }
# => ["46", "47", "48", "49", "50", "51"] 

每个元素都被选中,即使我不希望它们(最后一个除外)都被选中。如何修改我的陈述以获得我想要的东西?

4 个答案:

答案 0 :(得分:3)

(numbers + [nil]).each_cons(2).reject { |x, y| x.next == y }.map(&:first)

最后添加nil。我们将使用它来始终包含最后一个元素:

[1, 2, 3] + [nil] # => [1, 2, 3, nil]

将每两个连续元素配对:

[1, 2, 3].each_cons(2).to_a # => [[1, 2], [2, 3]]

删除不符合条件的对:

[1, 2, 5, 6, nil].each_cons(2).reject { |x, y| x.next == y }
  # => [[2, 5], [6, nil]]

从对中获取数字:

[[2, 5], [6, nil]].map(&:first) # => [2, 6]

答案 1 :(得分:1)

这是使用Enumerable#each_cons的一种方式。

arr = [1, 3, 4, 6, 7, 9]

arr.each_cons(2).
    each_with_object([]) { |(x,y),a| a << x unless x.next==y } << arr[-1]
  #=> [1, 4, 7, 9]

另一个选择是使用Enumerator#nextEnumerator#peek逐步调查枚举器。

enum = arr.to_enum
a = []
loop do
  x = enum.next
  a << x unless x.succ == enum.peek
end
a << arr[-1]
  #=> [1, 4, 7, 9]

当枚举器结束时,Enumerator#peek会生成StopIteration异常,由Kernel#loop通过突破循环来处理。

答案 2 :(得分:0)

尝试

data_col.select.with_index { |number_string, index| data_col[index + 1].to_i != 1 + number_string.to_i  }

或者,如果不介意将结果元素作为整数,

n_col = data_col.map(&:to_i)
n_col.select.with_index{ |n, i| n_col[i + 1] != n + 1 }

答案 3 :(得分:0)

[52]

这也会像您一样只返回while,它使用简单的{{1}}循环,并且很容易理解正在发生的事情。