我正在用Perl寫一個程序。它的一部分需要對數字進行排序。但這不是一個正常的排序。值是這樣的。 01,02,03,04,05,97,98,99
。我希望它可以像這樣排序。以特定方式在perl中排序
97
98
99
01
02
03
04
05
我們正在整理數據包。如果昨天的最後一個數據包是96,今天它將從97開始,直到99然後回到01 02 ....並且將在某個數字處停止說06.
我正在用Perl寫一個程序。它的一部分需要對數字進行排序。但這不是一個正常的排序。值是這樣的。 01,02,03,04,05,97,98,99
。我希望它可以像這樣排序。以特定方式在perl中排序
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 }
更新回答以迴應問題的最新更新。 – ikegami
我根據猜測在你的數據,你的號碼是連續的,但纏繞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 $splice\n";
@numbers = (splice (@sorted, $splice+1, @sorted - $splice), splice (@sorted, 0, $splice+1));
print join ",", @numbers;
編輯:好的,新的測試用例。可能不適合那些。希望這可以說明一種方法。但是,由於你的訂單存在差距(我沒有假設沒有差距),所以很難說,因爲你基本上正在尋找最大的差距。
你怎麼知道你從97開始?所有的數字都是連續的嗎? – Sobrique
不,它可以從1-99之間的任意隨機數開始。上面的例子只是一個例子..值將達到99,並且它從01開始,它將以某個隨機值進行座標。 – nithin
@nithin它是從「1」還是「01」開始的? – TLP