Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6379[/thread]

unterschiedliche sortierung eines hashes

Leser: 1


<< >> 9 Einträge, 1 Seite
mordur
 2004-07-05 18:03
#83881 #83881
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

in einem Hash steht in etwa so was:
Code: (dl )
%hash= ( 1 => 102, 2 => 103, 4 => 102, 5 => 104, 6 => 103, 8 => 101);

jetzt sollen die Keys in ein Array so einsortiert werden, das ich einmal dies erreiche:
Code: (dl )
@array=(1,2,4,5,6,8); # also nach key sortiert is einfach hab ich schon

und einmal so, dass sie sortiert nach den Werten des Hashes im Array stehen, also so:
Code: (dl )
@array=(8,1,4,2,6,5); # nach values sortiert, gruppiert und dann wieder aufsteigend sortiert


jemand ne idee?
renee
 2004-07-05 18:07
#83882 #83882
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
@array = sort{$hash{$a} <=> $hash{$b} || $a <=> $b} keys(%hash);
untested!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
[E|B]
 2004-07-05 18:13
#83883 #83883
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@renee

Wenn du schon die einzelnen Keys des Hashes explizit betrachtest (keys(%hash)), funktioniert dein Beispiel nicht.
Korrekt muss es so lauten:

Code: (dl )
@array = sort{$a <=> $b} keys(%hash);
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
mordur
 2004-07-05 18:14
#83884 #83884
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
scheint zu funzen, danke
renee
 2004-07-05 18:28
#83885 #83885
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
#! /usr/bin/perl

%hash= ( 1 => 102, 2 => 103, 4 => 102, 5 => 104, 6 => 103, 8 => 101);
@array = sort{$hash{$a} <=> $hash{$b} || $a <=> $b} keys(%hash);

print $_,"\n" for(@array);

Quote
~ 1> perl test.pl
8
1
4
2
6
5


gerade getestet!

@[E|B]: warum sollte das nicht funktionieren??
Du sortierst nur die Keys des Hashes. Was aber mordur wollte (wenn ich ihn richtig verstanden habe) war, dass erst nach den Values sortiert wird (der Teil vor den || ) und innerhalb der sortierten Values nochmal die zugehörigen Keys...\n\n

<!--EDIT|renee|1089037834-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
[E|B]
 2004-07-05 18:42
#83886 #83886
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Quote
Was aber mordur wollte (wenn ich ihn richtig verstanden habe) war, dass erst nach den Values sortiert wird (der Teil vor den || ) und innerhalb der sortierten Values nochmal die zugehörigen Keys...


Quote
nach values sortiert, gruppiert und dann wieder aufsteigend sortiert


Zuerst nach Values sortieren und dann wieder die Key Gruppierung vornehmen.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
renee
 2004-07-05 18:49
#83887 #83887
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, aber innerhalb der sortierten Values die Keys sortieren. D.h. wenn mehrere Keys den gleichen Value haben , dann soll für diese Values der Key sortiert werden:
Quote
%hash= ( 1 => 102, 2 => 103, 4 => 102, 5 => 104, 6 => 103, 8 => 101);


in Tabellenform:
Quote
1 102
2 103
4 102
5 104
6 103
8 101


erster Schritt nach Values sortieren:
Quote
8 101
4 102
1 102
6 103
2 103
5 104


Zweiter Schritt nach Keys sortieren:
Quote
8 101
1 102
4 102
2 103
6 103
5 104


Jetzt sind die Values immer noch nach Größe gruppiert, und die zugehörigen Keys sind innerhalb dieser Gruppierung nach Größe sortiert. So, wie das gewünschte Ergebnisarray aussieht, war es auch so gewollt...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mordur
 2004-07-06 14:15
#83888 #83888
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
genau!
Crian
 2004-07-07 04:21
#83889 #83889
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Zu solchen Sortierproblemen gibts ein paar Snippets auf meiner Perlseite (Link siehe Signatur).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 9 Einträge, 1 Seite



View all threads created 2004-07-05 18:03.