Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Вложенные хэши, сортировка


Автор: Ramirez 18.1.2005, 02:29
Уважаемый All!

Помогите написать алгоритм (или хоть намекните), который сортирует структуру из вложенных хешей по внутренним ключам. Например, есть структура типа:

$hash{key1}{key2} = value

вот пример:

$hash{a}{name} = "aaa";
$hash{b}{name} = "bbb";
$hash{c}{name} = "ccc";

Так вот я хочу ее отсортировать по значениям key2.
Тоесть чтобы первые ключи шли не как a,b,c а согласно стортировке по занчению name.

И что-то никак не соображу как...

Варианты типа:
foreach $key (sort { $hash{$a} cmp $hash{$b} } keys %hash) { }

тут видимо не прокатывают...

Цель всего этого, потом вывести при помощи foreach:

foreach (keys %hash) {
print $hash{$_}{name}."\n";
}

Автор: chaos 18.1.2005, 08:49
чето не совсем могу вникнуть в твою проблему, вот тебе пример по тому что понял
Код

$hash{a}{name} = "aaa";
$hash{b}{name} = "bbb";
$hash{c}{name} = "ccc";

foreach $key1 (keys %hash) {
 for $key2 (sort keys %{$hash{$key1}}) {
   print "$hash{$key1}{$key2}\n";
 }
}

если не то говори еще подумаем

Автор: Ramirez 18.1.2005, 10:14
Не совсем то. Попробую обьяснить подробнее. Допустим у меня есть учетные записи пользователей, каждый имеет уникальный идентификатор и кучу параметров (имя, email и пр.).
Я запихиваю их в hash таким образом:

Код

$hash{ID1}{NAME} = "User1";
$hash{ID1}{EMAIL} = "MAIL1";
......
$hash{ID2}{NAME} = "User2";
$hash{ID2}{EMAIL} = "MAIL2";
.....


Если сказать:

Код

foreach (sort keys %hash) {
 print $hash{$_}{NAME}."\n";
}


то они будут выведены отсортированными по коду (ID1, ID2 ...), а мне хочется их вывести отсортированными по имени (тоесть по значению NAME)...

Автор: dimes 18.1.2005, 10:39
Код

sort { $hash{$a}{'name'} cmp $hash{$b}{'name'} } keys %hash

Автор: Ramirez 18.1.2005, 10:57
2dimes: блин, и правда сортирует! smile А я голову ломал 2 дня... smile
А вот если по 2-м полям сортировать сразу?

Автор: dimes 18.1.2005, 12:17
Цитата(Ramirez @ 18.1.2005, 11:57)
вот если по 2-м полям сортировать сразу?

Код

sort { ( $hash{$a}{'name'} cmp $hash{$b}{'name'} ) or  ( $hash{$a}{'field2'} cmp $hash{$b}{'field2'} ) } keys %hash


Но правильнее наверное будет свою функцию использывать...

Автор: GoodBoy 19.1.2005, 15:47
Цитата(Ramirez @ 18.1.2005, 10:57)
вот если по 2-м полям сортировать сразу?

тут можно сделать так:

Код

sort { ( $hash{$a}{'name'} cmp $hash{$b}{'name'} ) ? ( $hash{$a}{'name'} cmp $hash{$b}{'name'} ) : ( $hash{$a}{'field2'} cmp $hash{$b}{'field2'} ) }

Автор: dimes 19.1.2005, 16:31
GoodBoy
????
Мой пример не рабочий или твой более правильный?

Автор: Ramirez 19.1.2005, 20:53
Цитата(dimes @ 19.1.2005, 16:31)
Мой пример не рабочий или твой более правильный?


Рабочий, рабочий! Подтверждаю smile

Автор: GoodBoy 20.1.2005, 14:02
Цитата(dimes @ 19.1.2005, 16:31)
Мой пример не рабочий или твой более правильный?

Идеологию Перла помнишь??? smile

Автор: dimes 20.1.2005, 14:47
Цитата(GoodBoy @ 20.1.2005, 15:02)
Идеологию Перла помнишь???

А то smile

Автор: GoodBoy 20.1.2005, 14:57
dimes
ну тогда сам понимаешь, что оба варианта - равноценны! :-))))

Автор: dimes 20.1.2005, 16:45
Неа smile
Мой короче и масштабируемее smile

Автор: GoodBoy 20.1.2005, 17:55
dimes
дык и мой - масштабируемый!!! smile подумай!!! smile

Автор: korob2001 21.1.2005, 03:29
GoodBoy и dimes ;)))))) Ваши примеры, оба рабочие и ничего удивительного здесь нет. Только не ссорьтесь. ;)))))))

Автор: dimes 21.1.2005, 11:12
smile

Автор: GoodBoy 21.1.2005, 13:37
korob2001
Дык никто и не ссорится!!!!!! Тут пытается родиться истинна!!!! :-))))))))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)