Hash sortieren

Hash sortieren

am 21.07.2007 16:23:23 von doleman

Hallo,

Ich benutze für eine Tk::tablematrix tabelle eine Hash Variable. Die
Tabelle besteht aus mehreen Spalten. im Hash ist das folgendermaßen
abgelegt: zeile,spalte =3D> Wert also z.B. 0,0 =3D> bla.
Jetzt müsste ich die Tabelle alphabetisch sortieren. Das klappt soweit
mit folgenden code:

#sortieren und in array sorted speichern
my @sorted =3D sort {

#titelzeilen sollen auch am anfang bleiben
if ( $a =3D~ /^0,/ ) { return -1; }
elsif ( $b =3D~ /^0,/ ) { return 1; }

#vergleichen
else {
return $$tableentries{$a} cmp $$tableentries{$b} }
} keys %$tableentries;

#hash in temphash ablegen
my %temptabent =3D %$tableentries;

my $rowidx =3D 0;
my $maxcol =3D $self->index( 'end', 'col' );

foreach my $sel (@sorted) {

my ( $row, $col ) =3D split( ",", $sel );

#aus dem array in richtiger reihenfolge lesen und im hash abglegen
#nur die erste spalte...
if ( $col eq '0' ) {
for ( my $colidx =3D 0 ; $colidx <=3D $maxcol ; $colidx++ ) {
$tableentries->{"$rowidx,$colidx"} =3D
$temptabent{"$row,$colidx"};

}
$rowidx++;
}
}


Jetzt habe ich das Problem das 2 1-Spalten den gleichen wert haben....
ist dies der Fall sollen sie nach der 2 Spalte sortiert werden.
Hab schon alles mögliche probiert komm aber zu kein
ergebniss...Irgendjemand ne idee?
gruss

Re: Hash sortieren

am 13.08.2007 08:53:00 von info

"doleman" schrieb im Newsbeitrag
news:1185027803.900878.125140@m3g2000hsh.googlegroups.com...
Hallo,

Ich benutze für eine Tk::tablematrix tabelle eine Hash Variable. Die
Tabelle besteht aus mehreen Spalten. im Hash ist das folgendermaßen
abgelegt: zeile,spalte => Wert also z.B. 0,0 => bla.
Jetzt müsste ich die Tabelle alphabetisch sortieren. Das klappt soweit
mit folgenden code:

Irgendwann gab es in dieser Gruppe mal das Problem. Es wurde so gelöst, dass
man die Spalten in ein Array gepackt hat und dieses dann sortiert hat:

sub ARRAY_SORT(\@\@\@\@$) {
my ($ary,$sort,$type,$rank,$del) = @_;
my @h = qw(b a b);
my @k = qw(<=> cmp);
@$ary = map {join $del => @$_} eval join join ('||' => map { qq {
(\$$h[$sort->[$_]] \->[$_] $k[$type->[$_]]
\$$h[$sort->[$_]-1]\->[$_]) }
} @$rank) => ('sort {', '} map { [split /\Q$del\E/] } @$ary;');
}

Beschreibung dazu gibts auch gleich hinterher:

# sub ARRAY_SORT
#
# Sortiert ein Array nach verschiedenen Kriterien:
#
# Aufruf:
# =======
# &ARRAY_SORT(\@array,\@sort,\@type,\@rank,$trenn)
#
# 1. @array
# zu sortierendes Array
# 2. @sort
# Array mit der Sortierreihenfolge der einzelnen Spalten:
# -1 = absteigend
# 1 = aufsteigend
# 3. @type
# Array, welches pro Spalte eine Markierung für den Datentyp enthält:
# 0 = nummerisch
# 1 = alphanummerisch
# 4. @rank
# Array mit der Reihenfolge der Spalten, nach der sortiert werden soll,
# beginnend bei 0
# Spalten, die nicht beachtet werden sollen, nicht auflisten
# 5. $trenn
# Einen Scalar, der das Trennzeichen innerhalb der Array-Felder
beschreibt
#
# Rückgabe:
# =========
# Das sortierte Array @array
#
# Beispiel:
# =========
# #!/usr/bin/perl -w
# use strict;
# my @array = ('def-789-2','abc-456-1','abc-123-4','ghi-123-3');
# my @sort = (1,-1,1);
# my @type = (1,0,0);
# my @rank = (0,1,2);
# my $trenn = '-';
# &ARRAY_SORT(\@array,\@sort,\@type,\@rank,$trenn);
# foreach (@array) {print"$_\n"}
#
# Mit bestem Dank an Andre Malo!
#

Grüße