2010-08-27 13 views
6

mam hash mieszań, tak:Jak mapować (i sortować) wartości z mieszania skrótów?

 
%hash = (a => { b => 1, c =>2, d => 3}, 
      a1 => { b => 11, c =>12, d => 13}, 
      a2 => { b => 21, c =>22, d => 23}) 

chcę wyodrębnić "b" element i umieścić go na tablicy. Teraz używam pętli, aby to zrobić, ale myślę, że mogę nieco poprawić wydajność, używając zamiast tego mapy. Jestem pewien, że gdyby była to tablica skrótów, chciałbym użyć czegoś takiego:

 
@hasharray = ({ b => 1, c =>2, d => 3}, 
       { b => 11, c =>12, d => 13}, 
       { b => 21, c =>22, d => 23}) 
@array = map { ($_->{b} => $_) } @hasharray 

Wybacz mi, jeśli się mylę, wciąż się uczę jak mapa działa. Ale chciałbym wiedzieć, w jaki sposób mam zamiar mapować mieszankę skrótów? Czy jest to możliwe za pomocą mapy? Nie znalazłem jeszcze przykładów tego.

Jeszcze lepiej, następnym krokiem w tym kodzie jest posortowanie tablicy po jej wypełnieniu. Jestem prawie pewien, że jest to możliwe, ale nie jestem wystarczająco inteligentny, żeby użyć mapy, aby samemu to zrozumieć. Jak chciałbym zrobić to wszystko za jednym razem?

Dzięki. Seth

Odpowiedz

11

This ekstrakty i sortuje wszystkie "b" s:

my @array = sort { $a <=> $b } map $_->{b}, values %hash; 
+0

To działało świetnie, dokładnie to, czego szukałem. Wymieniłem 26 linii kodu na tę i poprawiłem wydajność tej funkcji z około O (n) do O (1). Dzięki! – sgsax

+1

Cóż, musi jeszcze powtórzyć wartości hasza i posortować je, więc nie jest to O (1). – Corey

1

Zabierz swoje drugie rozwiązanie i zastąpić values %hash dla @hasharray:

@array = map { ($_->{b} => $_) } values %hash; 

(. I nie zapomnij ; wypowiedzieć oświadczenie)

3

To wypełnia @array z posortowaną listą odniesień tablicowych, każdy zawierający wartość b i wartość skrótu, z której pochodzi.

my @array = sort {$$a[0] <=> $$b[0]} 
      map { [$$_{b} => $_] } 
      values %hash; 

my @sorted_hashes = map {$$_[1]} @array; 
+1

'$ a -> [0]' jest łatwiejszy do odczytania niż '$$ a [0]'; podobnie '$ _-> {b}' zamiast '$$ _ {b}'. –

+0

Lepiej używać operatora '<=>' zamiast 'cmp' podczas sortowania liczb. –

+0

@eugene => dobry punkt, ustalenie. @Philip => Wolę podwójne pieczęcie z dwóch powodów. Po pierwsze, zawiera inne formy dereferencji, takie jak '@ $ a [1, 2]'. Po drugie, operator '->' jest używany do wywoływania metod, więc wolę używać go tylko w sytuacjach, w których jest wywoływany kod. –

Powiązane problemy