以一种特殊的方式在perl中进行排序



我正在用Perl编写一个程序。其中一部分需要对数字进行排序。但这不是一个正常的排序。价值观是这样的。CCD_ 1。我希望它像这样排序。

97
98
99
01
02
03
04
05

我们正在对数据包进行排序。如果昨天最后一个数据包是96,那么今天它将从97开始,一直持续到99,然后回到01 02。。。。并且会在某个数字处停下来,比如06。

假设昨天的最后一个数字是93(情况1)。你想要

94: position 0
95: position 1
..
93: position 99

模数运算可用于生成此映射。

($_ - $last_from_yesterday - 1) % 100

排序变得琐碎:

sort { ($a - $last_from_yesterday - 1) % 100 <=> ($b - $last_from_yesterday - 1) % 100 }

根据您的数据,我猜您的数字是连续的,但大约是100。因此,你会通过订购所有东西,然后寻找差距来找到"开始"。(不过,如果你有一个完整的周期,它就会中断!)

#!/usr/bin/env perl
use strict;
use warnings;
my @numbers = ( 1,2,3,4,5,97,98,99 ); 
#sort them
my @sorted = sort { $a <=> $b } @numbers;
#rotate the numbers until your 'gap' is off the end of the cycle. 
my $splice = 0; 
for ( my $index = 0; $index < $#numbers; $index++ ) {
    print 1+$sorted[$index]  % 100,",";
    print $sorted[$index+1] % 100,"n";
    if ( ($sorted[$index] + 1 ) %100 < $sorted[$index+1] % 100 ) { 
        $splice = $index;
    }
}
print "Splicing on $splicen";
@numbers = ( splice ( @sorted, $splice+1, @sorted - $splice ), splice ( @sorted, 0, $splice+1 ) );
print join ",", @numbers;

编辑:好的,新的测试用例。可能对这些人不起作用。希望这能说明一种方法。但由于您的订单存在缺口(我假设没有缺口),很难判断,因为您基本上是在寻找最大的缺口。

相关内容

  • 没有找到相关文章