2013-02-07 201 views
1

How to sort a list with a given order?Perl - 如何按給定順序對數組值進行排序?

我們已經討論瞭如何使用map和$ _根據給定順序對列表進行排序。今天我有另一個問題。

我有同樣的排序依據:

my @orderby = ('car', 'boat', 'chicken', 'cat', 'dog', 'mouse'); 
# or if it's better to the code: 
my %orderby = ('car' => 0, 
       'boat' => 1, 
       'chicken' => 2, 
       'cat' => 3, 
       'dog' => 4, 
       'mouse' => 5); 

現在我已經被排序依據被下令需要滿足以下條件:

print Dumper \%toys; 
$VAR = { 
     'animals' => [ 
          [ 
          'feather', 'cluck-2', 'chicken', 'white' 
          ], 
          [ 
          'bald', 'bark', 'dog', 'black stripes' 
          ], 
          [ 
          'feather', 'cluck-2', 'chicken', 'white' 
          ] 
         ], 
     'notanima' => [ 
          [ 
          'paited', 'motor', 'boat', 'red' 
          ], 
          [ 
          'painted', 'motor', 'car', 'blue on top' 
          ] 
         ] 
     }; 

的代碼需要使用3列基於排序依據排序。你需要爲動物和notanima使用相同的裝飾。 的重新排列後,$ VAR將是:

$VAR = { 
     'animals' => [ 
          [ 
          'feather', 'cluck-2', 'chicken', 'white' 
          ], 
          [ 
          'feather', 'cluck-2', 'chicken', 'white' 
          ], 
          [ 
          'bald', 'bark', 'dog', 'black stripes' 
          ] 
         ], 
     'notanima' => [ 
          [ 
          'painted', 'motor', 'car', 'blue on top' 
          ], 
          [ 
          'paited', 'motor', 'boat', 'red' 
          ] 
         ] 
     }; 
order %toys{key} by orderby; 

我曾試圖改變這種@ikegami提供

my %counts; ++$counts{$_} for @list; 
my @sorted = map { ($_) x ($counts{$_}||0) } @orderby; 

地圖解決方案,但我沒有成功。 你們有什麼想法,我怎麼能實現這個目標?

Thx提前!

更新!
我試圖用從池上的建議,我已經做到了這一點:

# that first foreach will give one ARRAY for animals and one ARRAY for notanima 
foreach my $key (keys %toys) 
{ 
    # that one will give me access to the ARRAY referenced by the $key. 
    foreach my $toy_ref ($toys{$key}) 
    { 
     my %orderby = map {$orderby[$_] => $_} 0..$#orderby; 
     my @sorted = sort { $orderby{$a} <=> $orderby{$b} } @{$toy_ref}; 
     # my @sorted = sort { $orderby{$a} <=> $orderby{$b} } $toy_ref; 
     print Dumper @sorted; 
    } 
} 

首先,這給了我警告:

Use of uninitialized value in numeric comparison (<=>) at.... 

我的排序爲notanima(的結果會忽視動物,所以後也不會那麼大):

基於排序依據
$VAR1 = [ 
     'paited', 'motor', 'boat', 'red' 
     ]; 
$VAR2 = [ 
     'painted', 'motor', 'car', 'blue on top' 
     ]; 

,打印順序必須是:

$VAR1 = [ 
     'painted', 'motor', 'car', 'blue on top' 
     ]; 
$VAR2 = [ 
     'paited', 'motor', 'boat', 'red' 
     ]; 

汽車需要先來。 我做錯了什麼?

+0

[Perl:如何按給定順序對列表進行排序?](http:// stackoverflow。com/questions/14730683/perl-how-to-sort-a-list-with-a-given-order) –

+0

如果上一個答案不起作用,請不要再提問相同的問題;更新您的舊問題並取消標記答案。 –

+0

爲什麼你使用標籤爲「人頭屎」的解決方案? – ikegami

回答

1

所以你有6個陣列排序,所以你需要6個電話sort

  1. 對於%玩具的每個元素,
    1. 爲了通過的%玩具該元素引用的數組中的每個元素,
      1. 排序如先前所示的引用數組。

請不要使用被標記爲「混亂與人們的心靈」的解決方案。

相關問題