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