首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对perl中的间隔数组进行排序?

对perl中的间隔数组进行排序?
EN

Stack Overflow用户
提问于 2014-11-23 13:33:01
回答 2查看 180关注 0票数 4

我在perl中有一个数组,其间隔如下:

@array = qw(1-5 7-9 10-15 20-58 123-192 234-256)

我试图使用排序来订购它,但这是我获得的:

1-5、10-15、123-192、20-58、234-256、7-9

它是按第一个数字的第一个字符排序的.如何才能按第一个整数排序才能得到下一个数组?

1-5,7-9,10-15,20-58,123-192,234-256

非常感谢!

附注:

我没有这方面的代码,我正在尝试命令

代码语言:javascript
运行
复制
my @sorted = sort @array;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-23 13:45:56

您需要为每个元素提取第一个数字,并使用<=>运算符进行数值比较,

代码语言:javascript
运行
复制
my @array = qw(1-5 7-9 10-15 20-58 123-192 234-256);
my @sorted = sort {
  my ($aa,$bb) = map /^([0-9]+)/, $a,$b; 

  $aa <=> $bb;
} @array;
票数 5
EN

Stack Overflow用户

发布于 2014-11-23 13:51:49

你想做的是数字排序。为此,您需要通过提供自己的方法来覆盖默认的排序方法。此代码:

代码语言:javascript
运行
复制
my @sorted = sort @array;

真正的意思是:

代码语言:javascript
运行
复制
my @sorted = sort { $a cmp $b } @array;

其中,cmp是字典比较运算符(或多或少按字母顺序排序)。你想使用<=>,通常被称为“太空船操作员”。

代码语言:javascript
运行
复制
my @sorted = sort { $a <=> $b } @array;

但是这个运算符只能与数字一起使用,而像7-9这样的字符串实际上并不是数字(尽管在本例中,它将工作,尽管发出的警告是Argument "7-9" isn't numeric in sort)。

为了克服这个警告和可能的错误,我们需要从我们想要排序的字符串中提取数字。我们使用正则匹配( regex )匹配:/\d+/g来完成此操作。这将匹配并返回字符串中的所有连续数字。

代码语言:javascript
运行
复制
my @sorted = sort {
                     my ($a1, $a2) = $a =~ /\d+/g;
                     my ($b1, $b2) = $b =~ /\d+/g;
                     $a1 <=> $b1 || $a2 <=> $b2;
} @array;

我们捕获并使用低范围和高范围,并在最后执行两个检查。这意味着在$a1$b1相等的情况下,<=>返回0||运算符执行替代比较$a2 <=> $b2

在某些情况下,这种操作很昂贵,需要时间,而且有了大量的数据集,这会导致排序变得非常慢。在这种情况下,我们可以使用Schwartzian变换缓存数据。在这种方法中,我们只需存储正则表达式匹配的值,并在排序时使用存储的值。为此,我们使用匿名数组ref [ ... ]。最后,我们恢复原始值并丢弃缓存:

代码语言:javascript
运行
复制
my @sorted = map  { $_->[0] }                # restore original
             sort { $a->[1] <=> $b->[1] }    # sort compares stored nums
             map  { [ $_, /\d+/g ] }         # store original, and nums
             @array;

如果您想要一个以上的排序级别,只需添加$a->[2] <=> $b->[2]等等。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27089498

复制
相关文章

相似问题

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