首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Perl中的整数列表中获取范围?

如何从Perl中的整数列表中获取范围?
EN

Stack Overflow用户
提问于 2010-04-21 13:26:45
回答 3查看 161关注 0票数 4

我有一个数字数组:

代码语言:javascript
运行
复制
@numbers = 1,2,3,6,8,9,11,12,13,14,15,20

我想这样打印出来:

代码语言:javascript
运行
复制
1-3,6,8-9,11-15,20

有什么想法吗?当然,我尝试了使用最常见的“循环”,但仍然没有得到它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-21 13:45:47

这里有一种可能的方法:

代码语言:javascript
运行
复制
@numbers = (1,2,3,6,8,9,11,12,13,14,15,20);
@list = ();
$first = $last = shift @numbers;
foreach (@numbers,inf) {
  if ($_ > $last+1) {
    if ($first == $last) {
      push @list, $first;
    } elsif ($first+1 == $last) {
      push @list, $first, $last;
    } else {
      push @list, "$first-$last";
    }
    $first = $_;
  }
  $last = $_;
}

print join ',', @list;
票数 4
EN

Stack Overflow用户

发布于 2010-04-21 13:47:16

您可以使用Set::IntSpan::Fast

代码语言:javascript
运行
复制
use Set::IntSpan::Fast;

my @numbers = (1,2,3,6,8,9,11,12,13,14,15,20);

my $set = Set::IntSpan::Fast->new;
$set->add(@numbers);
print $set->as_string, "\n";
票数 12
EN

Stack Overflow用户

发布于 2010-04-21 14:06:52

代码语言:javascript
运行
复制
@numbers=sort { $a <=> $b } @numbers;
push @numbers, inf;

@p=();
$ra = shift @numbers;
$rb = $ra;
for $n (@numbers) {
  if ($n > $rb +1) {
      push @p, ($ra == $rb ? "$ra" : "$ra-$rb");

      $ra = $n;
  }

  $rb = $n;
}

print join(',', @p); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2680539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档