gpt4 book ai didi

jq - 用范围替换数组中的连续整数

转载 作者:行者123 更新时间:2023-12-05 01:05:41 24 4
gpt4 key购买 nike

我想将连续整数组合到一个排序数组中,并使用 jq 将它们替换为范围。

示例 1

input: [1,2,3,4,6,98,99,101]
desired output: "1-4,6,98-99,101"

示例 2

input: [1,3,5]
desired output: "1,3,5"

示例 3

input: [1,2,3,4,5]
desired output: "1-5"

我找到了一个使用 foreach 的解决方案,但它对我来说似乎不是很优雅和紧凑。

这个任务有更简单的解决方案吗?

[foreach (.[], 99999) as $current
({};
if length == 0 then
{first: $current}
elif (has("last") | not) and .first + 1 != $current then
{first: $current, extract: "\(.first)"}
elif has("last") and .last + 1 != $current then
{first: $current, extract: "\(.first)-\(.last)"}
else
{first, last: $current}
end;
.extract // empty
)]
| join(",")

最佳答案

我会分两步完成。


首先,分组。

reduce .[] as $_ (
[];
if $_ - 1 == .[-1][1] then
.[-1][1] = $_
else
. + [ [ $_, $_ ] ]
end
)

这一步产生[[1,1],[2,4],[6,6],[98,99],[101,101]]


然后,构建字符串。

map(
if .[0] == .[1] then
"\( .[0] )"
else
"\( .[0] )-\( .[1] )"
end
) |
join(",")

Demo关于jqplay

它并没有更短,但我认为它更简单、更干净。

此外,分离关注点不仅有助于简化和清晰。您可以选择将代码隐藏在两个小函数中。您可以更轻松地自定义输出,例如为 [98,99] 生成 98,99 而不是 98-99。您甚至可以决定在根本不需要生成字符串的地方重用代码。

但最重要的是,这个解决方案消除了 99999 的魔力!

关于jq - 用范围替换数组中的连续整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70467714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com