2015-11-09 88 views
-2

我正在用Perl寫一個程序。它的一部分需要對數字進行排序。但這不是一個正常的排序。值是這樣的。 01,02,03,04,05,97,98,99。我希望它可以像這樣排序。以特定方式在perl中排序

97 
98 
99 
01 
02 
03 
04 
05 

我們正在整理數據包。如果昨天的最後一個數據包是96,今天它將從97開始,直到99然後回到01 02 ....並且將在某個數字處停止說06.

+0

你怎麼知道你從97開始?所有的數字都是連續的嗎? – Sobrique

+0

不,它可以從1-99之間的任意隨機數開始。上面的例子只是一個例子..值將達到99,並且它從01開始,它將以某個隨機值進行座標。 – nithin

+0

@nithin它是從「1」還是「01」開始的? – TLP

回答

2

說出昨天的最後一個數字是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 } 
+0

更新回答以迴應問題的最新更新。 – ikegami

0

我根據猜測在你的數據,你的號碼是連續的,但纏繞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; 

編輯:好的,新的測試用例。可能不適合那些。希望這可以說明一種方法。但是,由於你的訂單存在差距(我沒有假設沒有差距),所以很難說,因爲你基本上正在尋找最大的差距。

+0

雅。我測試了這種情況:01,02,04,06,07,91,95,99 它給了我下面的答案 拼接上6 99,1,2,4,6,7,91,95 – nithin

+0

這有效,但它不能徹底地工作 - 數字順序很容易檢測到休息。對於數字來說,很難判斷應該在哪裏休息。 – Sobrique

+0

@Sobrique你可能不應該按照字母順序對數字進行排序,即使它確實發生在這些數據上。 – TLP