Как я могу отсортировать множество массивов по одному массиву? - PullRequest
3 голосов
/ 26 октября 2010

У меня есть структура данных, подобная следующей

@colors = qw(red blond green);
@numbers = qw(349 1234.5678 3.14159265);
@hats = qw(fedora porkpie bowler);
my %hash = (colors => \@colors, numbers => \@numbers, hats => \@hats);

Я хочу отсортировать это по значениям одного из массивов, поддерживая ассоциацию элементов параллельного массива. То есть, если я обменяю $hash{numbers}[2] и индекс $hash{numbers}[3], я хочу сделать такой же обмен для всех других массивов в хэше. В этом случае, если я sort {$a <=> $b} на numbers:

$sorted{numbers} = [3.14159265, 349, 1234.5678];
$sorted{colors}  = ["green", "red", "blond"];
$sorted{hats}  = ["bowler", "fedora", "porkpie"];

Решение, которое я использую, теперь преобразует структуру %hash в массив, где $array[$i]{$k} == $hash{$k}[$i], делает @sorted = sort {$a->{numbers} <=> $b->{numbers}} @array, затем преобразует @sorted обратно из массива хэшей в хэш массивов.

Мне действительно все равно, если сортировка стабильна, мне просто интересно, есть ли лучший способ сделать это.

1 Ответ

10 голосов
/ 26 октября 2010

Вот трюк, который я использовал.

my @permutation = sort { $numbers[$a] <=> $numbers[$b] } (0..$#numbers);
@colors = @colors[@permutation];
@numbers = @numbers[@permutation];
@hats = @hats[@permutation];
# No change to %hash needed, since it has references to above arrays.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...