arrays - 如何在 Ruby 中将整数数组压缩为范围和整数数组

标签 arrays ruby range

我有一个排序的整数数组,并希望将所有连续整数的子集替换为一个范围,以便:

[1,2,3,4,5,6,7,8,9,10,42]

替换为:

[1..10,42]

这是用户未正确输入的 Google 电子表格中的行列表,无法导入到另一个系统的数据库中。有很多行,通常有几十行。用户更容易看到第 3201-3379 行都是错误的,而不必单独读取每个行号。

我不是要“Array of integers into array of ranges”。

我知道如何编写代码,我很乐意这样做,但如果有人已经这样做了,我就不会这样做了。我当前的代码并不优雅,如果已经有经过良好测试和优化的东西,我不会费心重构它。

最佳答案

我预计这个问题已在 SO 上被问到,但答案不在我的 Rolodesk 中。然而,这很容易做到。

arr = [1, 2, 3, 5, 6, 7, 8, 10, 12, 13, 14, 17, 18, 20]

arr.slice_when { |x,y| y > x+1 }.
    map { |a| a.size == 1 ? a.first : a.first..a.last }
  #=> [1..3, 5..8, 10, 12..14, 17..18, 20]

参见 Enumerable#slice_when .

我们首先计算枚举数

enum = arr.slice_when { |x,y| y > x+1 }
  #=> #<Enumerator: #<Enumerator::Generator:0x...0000...fe0>:each>

我们可以将 enum 转换为数组,以查看将由枚举器生成并提供给 map 的元素:

enum.to_a
  #=> [[1, 2, 3], [5, 6, 7, 8], [10], [12, 13, 14], [17, 18], [20]]

作为练习,看看是否还有另一个 Enumerable您可以使用代替 slice_when 的方法。 (提示:考虑 Great Peanut Butter Debate 。)

关于arrays - 如何在 Ruby 中将整数数组压缩为范围和整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61471764/

相关文章:

php - 动态创建一个用 N 个空元素初始化的数组

c# - 创建一副简单的纸牌 C#

ruby-on-rails - 对于潜在的高流量站点,我应该使用 haml 还是 erb 或 erubis?

Python范围函数

arrays - MongoDB聚合,如何addToSet组管道中数组的每个元素

c++ - 带有字符串数组的段错误c++

html - 如何显示前景图像然后在悬停时隐藏?

ruby-on-rails - 更改信用卡信息 (Stripe)

javascript - 如何进行跨越多个元素的范围选择?

javascript - 将一组重叠范围划分为一组非重叠范围