Perl: числовой вид массивов в хэше 2 (преобразование Шварца) - PullRequest
0 голосов
/ 31 октября 2011

Это продолжение этой темы: Perl: числовая сортировка массивов в хэше

Я не смог отредактировать исходный вопрос, потому что мой текущий код немного отличается, поэтому я просто задаю это как другой вопрос.

Хорошо, после использования преобразования Шварца, у меня есть это:

my @mylines =("0.899 0.92 cat", 
            "9.999 0.001 dog",
            "-0.52 0.3 humpty", 
            "13.52 0.09 bumbo",
            "-1.52 0.98 nanny",
            "3.52 0.34 lala");

my @sorted = map { join ' ', @$_ }
             reverse sort { $a->[0] cmp $b->[0] or $a->[1] <=> $b->[1] }
             map { [ split ] } (@mylines);

print "$_\n" for @sorted;

Я ожидаю, что выходные данные будут отсортированы сначала по первому столбцу, а затем по второму, но получается так:

9.999 0.001 dog
3.52 0.34 lala
13.52 0.09 bumbo
0.899 0.92 cat
-1.52 0.98 nanny
-0.52 0.3 humpty

Полагаю, это потому, что он выполняет сортировку символов ... но мне нужно, чтобы она была отсортирована по численности. Нужно ли помещать java-подобный parseInt () где-нибудь в функцию сортировки?

1 Ответ

3 голосов
/ 31 октября 2011

Вы делаете cmp в первом столбце. Это означает, что он сортирует его как текст. Ваша функция сортировки должна быть:

sort { $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1] } ...

Что делает вывод:

13.52 0.09 bumbo
9.999 0.001 dog
3.52 0.34 lala
0.899 0.92 cat
-0.52 0.3 humpty
-1.52 0.98 nanny

Однако вам никогда не нужно ставить reverse перед сортировкой, потому что вы всегда можете изменить условия:

sort { $b->[0] <=> $a->[0] or $b->[1] <=> $a->[1] } ...
...