2011-12-16 2 views
3

У меня есть хэш массивов, выглядит следующим образом:Perl Сортировка Хэш Массивы

{ $key, [$val1, $val2] } 

Я пытаюсь численно сортировать по второму значению массива и распечатать весь хэш. Я взглянул на сообщения Schwartzian Transform, но я не видел того, что делает именно то, что я хочу. Я также очень смущен синтаксисом и как сопоставить отсортированные значения в исходной форме {$key, [$val1, $val2] }. Любая помощь будет оценена!

+0

1 в 4, конечно? (Не то, чтобы это было намного лучше!) –

+1

@ davorg 5 вопросов, 1 принято. Не уверен, как SO вычисляет этот показатель, он уверен, выглядит странно. – TLP

+0

Преобразование Schwartzian занимается сортировкой по вычисленным значениям. Вы хотите вычислить их * один раз * для каждого элемента, а не 2 * nlogn times. У вас уже есть значение, которое вы хотите отсортировать по вычисленному '$ hash -> {$ key} [1]'. Вам не нужно преобразование Шварца. – Axeman

ответ

12

Не совсем уверен, что вы имеете в виду, но это, как вы реализуете процедуру сортировки по значению массива, внутри хэш:

my %hash = ('key1' => [ 1, 2 ], 'key2' => [ 2, 3 ]); 

for my $key (sort { $hash{$a}[1] <=> $hash{$b}[1] } keys %hash) { 
    print "$key => '", join(", ", @{$hash{$key}}), "'\n"; 
} 
+0

Отлично, работает как шарм. Благодаря! Я все еще привык к этому синтаксису, поэтому извиняюсь, если это кажется элементарным вопросом. – kurifu

6

Я вы действительно хотите использовать Шварца-Transform, здесь это способ сделать это:

#!/usr/bin/perl 
use Data::Dump qw(dump); 

my %hash = (k1 => [1, 2], k2 => [24, 5], k3 => [5, 1]); 
foreach(
     sort { $a->[1] <=> $b->[1] } 
     map { [$_, $hash{$_}->[1] ] } keys %hash) { 
    say $_->[0],' => ',dump$hash{$_->[0]}; 
} 

выход:

k3 => [5, 1] 
k1 => [1, 2] 
k2 => [24, 5] 

NB:

Я просто дать этот ответ в качестве примера Шварца Transform

Но, как говорится в комментарии, нет никакой необходимости в этом в том случае, объяснил в вопросе, ST является экономия затрат при это некоторые вычисления для каждого элемента массива перед сортировкой. По заданному вопросу нет никаких вычислений, поэтому не используйте ST здесь.

+1

Нам действительно нужно преобразование Шварца? Это не похоже на '$ hash {$ _} -> [1]' - дорогостоящая операция. – TLP

+2

@TLP: ОП задал конкретно вопрос о трансформации Шварца, поэтому я считаю, что на его месте он получает пример реализации. Однако я думаю, что объяснение конкретного случая должно сопровождаться алгоритмом, поскольку эти типы выражений могут быть немного пугающими для новичков Perl. – flesk

+2

@flesk Люди просят всевозможные сумасшедшие вещи, которые им не нужны. = P С его данными, Шварццианское Преобразование фактически увеличивает стоимость. Я думаю, правильно это показать, но было бы неплохо упомянуть, что в этом случае это не нужно. – TLP

Смежные вопросы