2012-09-12 43 views
0

我想,這樣的字符串按以下順序拉閘排序字符串數組:如何給出這些字符串的任意排序的字符串數組?

@set = ('oneM', 'twoM', 'threeM', 'sixM', 'oneY', 'twoY', 'oldest'); 

正如你可能會注意到,這些代表的時間段,從而oneM是第一個月,等我的問題是,我想用一段時間來排序,而是用字符串,因爲它們是我不能只用「排序」,所以我創造了這個哈希來表達字符串應該如何下令:

my %comparison = (
    oneM => 1, 
    twoM => 2, 
    threeM => 3, 
    sixM => 6, 
    oneY => 12, 
    twoY => 24, 
    oldest => 25, 
); 

這是我希望能讓我的生活更輕鬆,我可以做些事情如:

foreach my $s (@set) { 
    foreach my $k (%comparison) { 
     if ($s eq $k) { 
      something something something 

我感覺這是一種漫長的做事方式,我實際上並不確定如果我找到了相當於我的實際排序方式......我想我是錯過我自己的情節有點,所以任何幫助,將不勝感激

根據要求,預期的輸出將像它是如何顯示在@set上面。我應該提到@set中的值將成爲該集合的一部分,但不一定是所有這些值,也不是相同的順序。

+1

爲什麼它總是在我的帖子開頭解析出你好,這是一個很好的問題;( – dgBP

+0

,因爲這是問答數據庫,而不是論壇或郵件列表 –

+0

並不意味着我不能友好:) – dgBP

回答

5

您已經選擇了預計算數據的好策略,以便於排序。你可以在排序本身的時候計算這些數據,但是你會浪費時間重新計算每次sort需要比較的值,這在整個過程中會發生多次。另一方面,緩存的缺點顯然是,你需要額外的內存來存儲它,儘管整體計算量較少,但它可能會在低內存條件下降低排序速度。

與您的當前設置的排序是那麼容易,因爲:

my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @set; 

而如果你想在CPU的費用節省內存它會是:

my @sorted = sort { calculate_integer_based_on_input{$a} <=> calculate_integer_based_on_input{$b} } @set; 

有獨立calculate_integer_based_on_input功能將動態地將oneY等轉換爲12或其他相應的值,或者將輸入轉換爲適合分類的內容。

您可能還想查看使用緩存計算排序的常見習慣用法,如Schwartzian transformGuttman Rosler Transform

+0

非常有用 - 節省內存總是一件好事,非常感謝:) – dgBP

+0

也從'List :: UtilsBy'的'sort_by'函數。這可以簡化上面的簡單sort_by {calculate_integer_based_on_input($ _)} @set 這是Schwartzian變換的抽象 – LeoNerd

5

給出一個輸入和你的預期結果的例子會有所幫助。我想,這是你在找什麼:

my @data = (...); 
my %comparison = (
    oneM => 1, twoM => 2, threeM => 3, 
    sixM => 6, oneY => 12, twoY => 24, 
    oldest => 25, 
); 

my @sorted = sort { $comparison{$a} <=> $comaprison{$b} } @data; 

有很多在perlfunc手冊頁sort函數的文檔中的例子。 (「perldoc -f sort」)

+0

謝謝,我看了幾個例子,但顯然不瞭解這個例子中的應用。 – dgBP