arrays - 如何在Ruby中将整数数组压缩为范围和整数数组
问题描述
我有一个排序的整数数组,并希望将所有连续整数的子集替换为一个范围,以便:
[1,2,3,4,5,6,7,8,9,10,42]
替换为:
[1..10,42]
它是来自 Google 电子表格的行列表,用户没有正确输入,并且无法导入到另一个系统的数据库中。有很多行,通常是几十行。用户更容易看到第 3201-3379 行都是坏的,而不必单独读取每个行号。
我不是要“整数数组到范围数组中”。
我知道如何编写代码,我很乐意这样做,但如果有人已经这样做了,我就不会这样做。我当前的代码并不优雅,如果已经有一些经过良好测试和优化的东西,我不会费心去重构它。
解决方案
我希望这个问题已经在 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]
我们首先计算枚举器
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
. (提示:考虑花生酱大辩论。)
推荐阅读
- user-interface - 如何在图形python中获取用户点击次数
- flutter - 登录 at_chats 时出现异常“OnboardingStatus:PRIVATE_KEY_NOT_FOUND”
- python - 当我尝试将原始查询集转换为查询集时出现错误
- python - 嵌套模型不在梯度磁带中训练
- sql - 在 SQL Server 中,如何使用 concat 列连接 --> 组
- git - 带有 GitLens 插件的 VSCode 中的 GitLens“分支”视图总是与远程过时
- azure-logic-apps - 如何在逻辑应用程序中传递 url 编码的正文参数
- api - 是否可以在 laravel 的请求中编写 api 验证逻辑
- training-data - 将 mfcc 特征与训练标签相结合
- android - 为什么 TextView 没有显示在应用程序界面上?