我想从我的数组中选择所有元素,使其后面的元素不是一个加上当前元素。
我试过了:
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"]
每个元素都被选中,即使我不希望它们(最后一个除外)都被选中。如何修改我的陈述以获得我想要的东西?
答案 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#next和Enumerator#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}}循环,并且很容易理解正在发生的事情。