2013-06-02 3 views
3

У меня есть хэш массивов, и я хотел бы отсортировать их по размеру массива.Как сортировать хэш массивов по размеру массива

Вот мой код до сих пор:

use strict; 
use warnings; 

my %hash_array = (
    "array_1" => ["apple", "ball", "cat"], 
    "array_2" => ["def", "leppard", "rocks", "too"], 
    "array_3" => ["italian", "pastry", "missing", "cherry", "top"], 
); 

# Length of array_1 
my $array_1_size = @{$hash_array{"array_1"}}; 
print "Should print three: $array_1_size\n"; 

# Found this here: https://stackoverflow.com/questions/15722286 
# But my result remains unsorted 
foreach my $key (sort { $hash_array{$b} <=> $hash_array{$a}} keys %hash_array) { 
    print "key: $key\n"; 
} 

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

Я скопировал последний блок foreach с here, но это решение не работает для меня, так как мой вывод не упорядочен. У меня возникли некоторые вопросы о последнем блоке кода:

  1. Я не вижу $ b и $, на которые ссылался ранее. Является ли это встроенной ссылкой, которую понимает функция сортировки?
  2. Решение, похоже, сработало для оригинального плаката, но оно не работает в моем случае. Но наши первоначальные цели схожи. Что мне недостает, чтобы получить упорядоченный вывод на основе размера массива?
  3. Каков наилучший способ сортировки хэша массивов по размеру массива в порядке возрастания и убывания?
+0

Если вы посмотрите на вопрос, на который вы ссылаетесь, на плакате написано: «Я не знаю, почему это не работает» * о код, который вы скопировали. Ответ, который он принял, - это то, что вы должны копировать. – Borodin

ответ

5

Вы были близки. Как написано, вы сравнивали ссылки массива, которые являются более или менее адресами памяти. Я немного изменил ваш код, чтобы дать вам то, что вы ищете:

foreach my $key (sort { scalar(@{$hash_array{$b}}) <=> scalar(@{$hash_array{$a}}) } keys %hash_array) { 
    print "key: $key\n"; 
} 
+0

Отлично! Я знал, что это что-то маленькое. Спасибо :) –

+2

Нет необходимости в вызовах 'scalar', поскольку оператор' <=> 'применяет скалярный контекст. '@ {$ hash_array {$ b}} <=> @ {$ hash_array {$ a}}' отлично. – Borodin

4

Функция сортировки - это точно - анонимный под. Вы не ограничены одним сравнением, вам просто нужно закончить с чем-то, что возвращает -1, 0 или 1. И да, $a и $b - это два сравниваемых значения - они могут быть скалярами или ссылками.

Вы могли бы решить проблему следующим образом:

foreach my $key (sort { 
         my $length_a = scalar @{$hash_array{$a}}; 
         my $length_b = scalar @{$hash_array{$b}}; 
         $length_b <=> $length_a 
         } keys %hash_array) { 
    ... 
} 

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

+0

Бесполезное использование «скаляра». – ikegami

+0

Преднамеренное бесполезное использование в образовательных целях. :-) Я вижу, что принятый ответ - это именно мой ответ без какого-либо контекста или объяснения. – RET

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