2013-05-31 4 views
0

Мой брат имеет тысячи наименований идентификаторов и количества проданных товаров в следующем виде:Perl: Как сделать оптимальный рейтинг

$VAR1 = { 
       'sold_times' => 4, 
       'item_id' => 1, 
      }; 

    $VAR2 = { 
       'sold_times' => 1, 
       'item_id' => 2, 
      }; 
    ... 

Эта информация приходит от чтения журнала. В Perl, эти данные определяются как:

my @items_ids_sold_count_map = 
    map({ sold_times => $item_id_sold_count_map{$_}, item_id => $_,}, @items_ids); 

Где: $ item_id_sold_count_map хэш и @items_ids ключи от такого хэша. Для справки, хэш приходит от чтения файла журнала, как я уже говорил раньше:

open my $infile, "<", $file_location or die("$!: $file_location"); 
    while (<$infile>) { 
     if (/item_id:(\d+)\s*,\s*sold/) { 
      $item_id_sold_count_map{$1}++; 
     } 
    } 
    close $infile; 

Я хотел бы представить это в рейтинге. Критерии будут «sold_items» в порядке убывания. Например, мне представляется, что он представлен в структуре данных, такой как:

$VAR1 = { 'position' => 1, 'info' => { 'item_id' => 1, 'sold_items' => 4 }, 
       'position' => 2, 'info' => { 'item_id' => 2, 'sold_items' => 1 }, ... }; 

Как создать эту структуру данных? В то время как Im не ищет «лучший» способ точно, есть около 500 000 предметов.

+0

Возможно, вам не хватает уровня группировки в нужной структуре данных. У вас не может быть дубликатов одного и того же ключа в одном хеше. – Barmar

+0

Почему бы просто не отсортировать массив по 'sold_items'? Тогда индекс массива - это позиция, вам не нужен другой хеш. – Barmar

+0

@items_ids = (1, 2); – ado

ответ

1

Кажется, что вы должны иметь возможность сортировать массив напрямую, не добавляя дополнительный уровень хэша. Что-то вроде:

my @ranked = sort { $a->{sold_items} <=> $b->{sold_items} } @items_ids_sold_count_map; 

Идея здесь состоит в том, чтобы сравнить хэш-поля каждого элемента, чтобы определить порядок сортировки. Вы можете переключать «a» и «b», чтобы идти между возрастающими и убывающими порядками сортировки.