2013-07-25 3 views
0

У меня есть объект в формате, показанном ниже, и мне нужно сгруппировать их по доступным месяцам. 1000, 2000, ect. представляют собой суммы в долларах, а следующий уровень (6, 4) - месяцы.Групповой объект Perl дочерними узлами

Мой Объект:

$VAR1 = { 
      '1000' => { 
         '6' => { 
           'APR' => '13.9' 
          }, 
         '4' => { 
           'APR' => '11.9' 
          } 
        }, 
      '2000' => { 
         '6' => { 
           'APR' => '13.9' 
          }, 
         '4' => { 
           'APR' => '11.9' 
          } 
        }, 
      '4000' => { 
         '6' => { 
           'APR' => '13.9' 
          }, 
         '4' => { 
           'APR' => '11.9' 
          } 
        } 
      '5000' => { 
         '6' => { 
           'APR' => '13.9' 
          } 
        } 
     }; 

Объект I Want:

$VAR1 = { 
    '6' => { 
      '1000', 
      '2000', 
      '4000', 
      '5000' 
      }, 
    '4' => { 
      '1000', 
      '2000', 
      '4000' 
      } 
} 
+1

Объект является то, что вы можете вызвать его методы. Вы хотите просто хэш. – innaM

ответ

3
my %new_hash; 
for my $amount (sort { $a <=> $b } keys(%$VAR1)) { 
    for my $month (keys(%{ $VAR1->{$amount} })) { 
     push @{ $new_hash{$month} }, $amount; 
    } 
} 
+0

Не мог бы попросить более элегантное решение, спасибо вам большое! –

+0

Мое предложение состоит в том, чтобы не сортировать, поскольку он ничего не добавляет к хэшу, поскольку хэш будет помещать его туда, где он хочет. Сортировка после факта была бы более эффективной. Это 'nlogn + n' с сортировкой; однако, спасибо за простой код! –

+0

@Patrick Robert Shea O'Connor, я сортирую содержимое массива, а не хэш. И это просто «O (N log N)» (а не «O (N)») с сортировкой. Нет '+ N' (и даже если бы это было, это упростило бы прочь) – ikegami

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