Автор Тема: сортировка хэша  (Прочитано 7275 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« : 02 Июля 2004, 12:42:41 »
:insane:
Ребятки, дорогие, научите сортировать хэш, а? рази навсегда. :confused:
бьюсь-бьюсь с этой заразой, что-то никак у меня "не выходит каменный цветок".
отсортировать да потом еще и на печать бы вевести...
стыдно сказать - перегоняю в массив, сортирую как нужно, да и печатаю.

  001 цифра1|цифра2|цифра3|цифра4|буквы|цифра5
key^

Как сортировать по key понятно. ;) А вот как отсотрировать это, например по "цифра4" - не знаю. :(
пробовала по всякому. что-то даже получалось но при этом куда-то пропадали значения по которым сортируешь.
Вот, например, в таком хэше есть скажем 40 записей, нужно его отсртировать и вывести в банальную html таблицу.
сейчас я вот как делаю:

while (($ky, $ve) = each (%HASH)) {
   my ($tt,$m,$d,$h,$rr,$w)=split (/\\|/,$ve);
   my ($r,undef) = split(/\\|/,$Remark{$ky});
   push (@cnt,join(\'|\', $ky,$r,$tt,$m,$d,$h,$rr,$w,"\\n"));
 }
@cnt=sort $data @cnt;

$data получаю из строки запроса. в данном случае это "bymnt"

sub bymnt { my $mnta=(split(/\\|/,$a))[3]; my $mntb=(split(/\\|/,$b))[3]; return ($mntb <=> $mnta); }
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #1 : 02 Июля 2004, 13:06:15 »
perldoc -q sort
The documentations is your friend

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #2 : 02 Июля 2004, 14:15:51 »
хороший ответ. "разбирайся сама".
оставлю как есть.
и на том спасибо.
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #3 : 02 Июля 2004, 14:21:41 »
AnnA ответ замечательный - там все как на лодоне. или ты мне предлагаешь за тебя написать?
The documentations is your friend

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #4 : 02 Июля 2004, 14:46:55 »
NeoNox для Вас, может и на "лодоне". и потом, я же сказала "спасибо". Нет, не прдлагаю. Не нужно за меня ничего писать. На той ладони нет нужного мне примера кода из которого я уже дальше разобралась бы во всем сама. Ну или он есть, но я его просто не вижу.
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #5 : 02 Июля 2004, 15:31:46 »
у тебя в каждом элементе только пять значений?
The documentations is your friend

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #6 : 02 Июля 2004, 15:43:13 »
нет. ошиблась. на самом деле только 6!
в каждом элементе только шесть значений.
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #7 : 02 Июля 2004, 15:51:24 »
посмотри вот это
Цитировать
%h = (
       001 => ["one", "two", "three"],
       002 => ["four", "five", "six"]
     );

foreach my $key (sort { $h{$a}[1] cmp $h{$b}[1] } keys %h){
    print "$key = $h{$key}[1] \\n";
}

здесь структуру я намеренно упростил.
надеюсь дописать под себя несложно будет?
(здесь сортировка идет по второму значению $h{$a}[1])
« Последнее редактирование: 02 Июля 2004, 15:59:54 от NeoNox »
The documentations is your friend

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #8 : 02 Июля 2004, 18:27:25 »
ничего себе "упростил"! :)
while (($ky, $ve) = each (%SH)) {
   
   ($tt,$m,$d,$h,$rr,$w)=split (/\\|/,$ve);
   ($r,undef) = split(/\\|/,$R{$ky});
  %h = ( $ky => [$r,$tt,$m,$d,$h,$rr,$w] );
#$ky = 001 до 100

# %h{"$ky"}=["$r", "$tt", "$m", "$d", "$h", "$rr", "$w"];
#при такой записи вообще выдается ошибка компилякии

 }


foreach my $key (sort { $h{$a}[1] cmp $h{$b}[1] } keys %h){
print "$key = $h{$key}[1] \\n";
}


на печать идёт одна строка. последняя. всего их ровно 100.
т.е. как бы не создается хэш массивов. :(
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #9 : 02 Июля 2004, 18:30:56 »
пришлось за тебя писать

%o = (
       001 => "one|two|three",
       002 => "four|five|six"
     );

$h{$_} = [split /\\|/, $o{$_}] foreach (keys %o);

foreach my $key (sort { $h{$a}[1] cmp $h{$b}[1] } keys %h){
    print "$key = $h{$key}[1] \\n";
}
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #10 : 02 Июля 2004, 18:32:36 »
Цитировать
AnnA:
# %h{"$ky"}=["$r", "$tt", "$m", "$d", "$h", "$rr", "$w"];

и шо это ты тут хотела сказать?
ошибки нужно исправлять а не комментировать.
$h{"$ky"}=["$r", "$tt", "$m", "$d", "$h", "$rr", "$w"];
The documentations is your friend

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #11 : 02 Июля 2004, 18:59:21 »
while (($ky,$ve) = each (%SH))
 {
   ($tt,$m,$d,$h,$rr,$w)=split (/\\|/,$ve);
   ($r,undef) = split(/\\|/,$R{$ky});
   $h{"$ky"}=["$r", "$tt", "$m", "$d", "$h", "$rr", "$w"];
 }

foreach my $key (sort { $h{$a}[1] <=> $h{$b}[1] } keys %h)
{ print "$key = $h{$key}[1]
"; }

УРА! :)
NeoNox :appl:
спасибо Вам огромное! :) Вы мне очень помогли! :chmok:
а теперь я буду перебирать вот эту единичку print "$key = $h{$key}[1] и спокойненько печатать нужные элементички. да, правильно? ой. сейчас попробую.
пока-пока. :)

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
сортировка хэша
« Ответ #12 : 02 Июля 2004, 19:11:58 »
Да, правильно.
The documentations is your friend

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
сортировка хэша
« Ответ #13 : 03 Июля 2004, 03:51:27 »
Используя "The Schwartzian Transform"
A Fresh Look at Efficient Perl Sorting

my %hash = (
            \'001\' => "a|f|z|h",
            \'002\' => "b|g|x|h",
            \'003\' => "c|e|z|f",
            \'004\' => "c|e|z|e",
);

my $pole_sortirovki = \'1\';        # Ukazi\'vaetsya ot 1 i do 4 dlya dannogo primera

print join "\\n",
      map  { $_->[0]." = ".$_->[1] } #Zdes perechislyayutsya polya kotorie nuzhno vivesti na pechat
      sort { $a->[$pole_sortirovki]  cmp  $b->[$pole_sortirovki] }
      map  { [$_ , split /\\|/, $hash{$_}] } keys %hash;

Первый "map" можно заменить, в зависимости от нужд, на

map  { $_->[0]." = ".$_->[1]."|".$_->[2]."|".$_->[3]."|".$_->[4] }

"sort" же можно заменить на

      sort { $a->[3]  cmp  $b->[3] ||
             $a->[4]  cmp  $b->[4] }

что даст возможность сортировать сначала по полю 3, можно изменить, а затем еще и по полю 4, что тоже можно изменить.
« Последнее редактирование: 03 Июля 2004, 04:08:07 от vladsu »
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сортировка хэша
« Ответ #14 : 03 Июля 2004, 16:15:25 »
vladsu здоровско! Пасиба! :)
для меня - самоучки, ой как трудно даются все эти примудрости. но интересненько. ;)
пока-пока. :)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28