1

その中で、指定された順序でリストをソートする方法は?

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); 

そして今、orderbyで注文する必要がある次のものがあります。

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'
                          ]
                        ]
       };

コードは、orderby に基づいて 3 列を使用して並べ替える必要があります。動物とノタニマには同じ順序を使用する必要があります。再配置後、$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;

しかし、私は成功しませんでした。どうすればこの目的を達成できるか考えていますか?

事前にt​​hx!

アップデート!
私は池上からの提案を使おうとしていました、私はこれをしました:

# 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'
       ];

orderby に基づいて、印刷順序は次のようにする必要があります。

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

車が最初に来る必要があります。私が間違ったことをしましたか?

4

1 に答える 1

1

並べ替える配列が 6 つあるため、 を 6 回呼び出す必要がありますsort

  1. %toys の各要素について、
    1. %toys の要素によって参照される配列の各要素に対して、
      1. 前に示したように、参照された配列を並べ替えます。

そして、「人々の心を混乱させる」とラベル付けされたソリューションを使用しないでください.

于 2013-02-07T23:08:01.377 に答える