1

私は refs の配列を持っています。何かのようなもの

$a[0] = [qw( 1 2 3 4 )];
$a[1] = [qw( a b c d )];

、 、 は、実際にはナビゲーションに使用される Web サイトの1ブレッド2クラム3です4( 、HomeProfile) 。Contact-usContact-me-specifically

ここで、このはしごをソートする必要があります (悲しいことに、perl 5.8 で安定したソートを使用するオプションはありません)。

選別基準は、

  1. はしごの深さ
  2. 2 つのはしごの深さが同じ場合は、インデックスに応じて並べ替えます。

たとえば、配列に元々含まれている場合

$a[0] = [qw( 1 2 3 4 )];
$a[1] = [qw( 1 2 3 )];

次に、並べ替えの後、配列に含まれている必要があります

$a[0] = [qw( 1 2 3 )];
$a[1] = [qw( 1 2 3 4 )];

しかし、配列が次のような場合:-

$a[0] = [qw( 1 2 3 )];
$a[1] = [qw( a b c )];

次に、並べ替えの後、

$a[0] = [qw( 1 2 3 )];
$a[1] = [qw( a b c )];

私が試したこの方法では動作しません。

my @sorted_array = sort { @$b <=> @$a || $a <=> $b } @a;

誰かがこれで私を助けることができますか?

4

3 に答える 3

4

データ構造の記述 (リンクされたリスト) とsortルーチンの実装 (arrayrefs) が完全に一致しません。私は後者を想定します。

安定していないソートは、2 番目の基準として位置でソートすることによって安定させることができます。

sort { normally or by_index } @stuff

通常、配列の長さを比較したいようです。インデックスをテストできるようにするには、何らかの方法で現在の要素のインデックスを利用できるようにする必要があります。これには、次の 2 つの方法があります。

  1. シュワルツ変換を実行し、各要素にそのインデックスで注釈を付けます。これはばかげています。
  2. 要素ではなく、インデックスを並べ替えます。

これは次のようになります。

my @sorted_indices =
  sort { @{ $array[$b] } <=> @{ $array[$a] } or $a <=> $b } 0 .. $#array;
my @sorted = @array[@sorted_indices]; # do a slice

以前に行っていたのは、$a <=> $b参照の比較でした。これは、意味のあることを保証するものではありません。

そのテストsort

use Test::More;
my @array = (
  [qw/1 2 3/],
  [qw/a b c/],
  [qw/foo bar baz qux/],
);
my @expected = (
  [qw/foo bar baz qux/],
  [qw/1 2 3/],
  [qw/a b c/],
);

...; # above code
is_deeply \@sorted, \@expected;
done_testing;
于 2013-07-11T13:10:32.690 に答える