Zweidimensionales Hash sortieren
Schnaps
- perl
Hallo zusammen
ich habe hier ein zweidimensionales Hash das so aussieht.
$neu_alignment{'name1'}{'0'}=a
$neu_alignment{'name2'}{'0'}=c
$neu_alignment{'name3'}{'0'}=-
$neu_alignment{'name4'}{'0'}=-
$neu_alignment{'anzahl'}{'0'}=1
$neu_alignment{'name1'}{'1'}=a
$neu_alignment{'name2'}{'1'}=a
$neu_alignment{'name3'}{'1'}=a
$neu_alignment{'name4'}{'1'}=a
$neu_alignment{'anzahl'}{'1'}=4
$neu_alignment{'name1'}{'2'}=a
$neu_alignment{'name2'}{'2'}=b
$neu_alignment{'name3'}{'2'}=b
$neu_alignment{'name4'}{'2'}=t
$neu_alignment{'anzahl'}{'2'}=2
Da sind jeweils Spalten aus einer Tabelle drin.
ich möchte das nun so ausgeben lassen das die Spalte mit dem höchsten Wert bei 'anzahl' hat zuerst gezeigt wird und dann die anderen dahinter.
Also so:
name1 a | a | a
name2 a | b | c
name3 a | b | -
name4 a | t | -
Ich stecke gerade etwas fest, hoffe das mir einer von euch helfen kann.
MFG
Schnaps
Hi, mach einen Bubbelsort...
$anzahl_saetze = count($neu_alignment{'anzahl'});
for($i=0; $i<$anzahl_saetze; $i++) {
for($j=$anzahl_saetze-$i; $j>0; $j--) {
if($neu_alignment{'anzahl'}{$j-1} > $neu_alignment{'anzahl'}{$j} ) {
$temp{'name1'} = $neu_alignment{'name1'}{$j-1};
$temp{'name2'} = $neu_alignment{'name2'}{$j-1};
$temp{'name3'} = $neu_alignment{'name3'}{$j-1};
$temp{'name4'} = $neu_alignment{'name4'}{$j-1};
$temp{'anzahl'} = $neu_alignment{'anzahl'}{$j-1};
$neu_alignment{'name1'}{$j-1} = $neu_alignment{'name1'}{$j};
$neu_alignment{'name2'}{$j-1} = $neu_alignment{'name2'}{$j};
$neu_alignment{'name3'}{$j-1} = $neu_alignment{'name3'}{$j};
$neu_alignment{'name4'}{$j-1} = $neu_alignment{'name4'}{$j};
$neu_alignment{'anzahl'}{$j-1}= $neu_alignment{'anzahl'}{$j};
$neu_alignment{'name1'}{$j} = $temp{'name1'};
$neu_alignment{'name2'}{$j} = $temp{'name2'};
$neu_alignment{'name3'}{$j} = $temp{'name3'};
$neu_alignment{'name4'}{$j} = $temp{'name4'};
$neu_alignment{'anzahl'}{$j}= $temp{'anzahl'};
}
}
}
Hinweis: Nur Ansatz, keine Funktionsprüfung :o)
Gruss
Stefan
danke schon mal für deine Hilfe
Die einzelnden Namen werden bei mir aber immer dynamisch erzeugt, also es sind nicht immer nur die 4 Beispiel Namen.
ich wollte dein Script dann durch die entsprechenden foreach Schleifen ersetzen, tuhe mich aber doch sehr schwer damit.
for(my $i=0; $i<$anzahl_saetze; $i++) {
for(my $j=$anzahl_saetze-$i; $j>0; $j--) {
if($neu_alignment{'anzahl'}{$j-1} > $neu_alignment{'anzahl'}{$j} ) {
foreach my $test(%neu_alignment) {
$temp{$test} = $neu_alignment{$test}{$j-1};
}
foreach my $test{%neu_alignment) {
$neu_alignment{$test}{$j-1} = $neu_alignment{$test}{$j};
}
foreach my $test{%neu_alignment) {
$neu_alignment{$test}{$j} = $temp{$test};
}
}
}
}
Kann da bitte noch mal einer drüber schauen.
MFG
Schnaps
Gruss
Stefan
Hallo Schnaps
Hallo zusammen
ich habe hier ein zweidimensionales Hash das so aussieht.
$neu_alignment{'name1'}{'0'}=a
$neu_alignment{'name2'}{'0'}=c
$neu_alignment{'name3'}{'0'}=-
$neu_alignment{'name4'}{'0'}=-
$neu_alignment{'anzahl'}{'0'}=1
Deine Datenstruktur ist sehr fragwürdig.
Wenn du name1 bis name4 hast klingt das doch stark nach einem Array und der 2. Schlüssel sowieso. 0, 1, 2 das ist ein Array.
Vielleicht wäre alle einfacher, wenn du die Struktur sinnvoll änderst.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $alignment = [
{
name1 => 'a',
name2 => 'c',
name3 => '-',
name4 => '-',
anzahl => 1
},
{
name1 => 'a',
name2 => 'a',
name3 => 'a',
name4 => 'a',
anzahl => 4
},
{
name1 => 'a',
name2 => 'b',
name3 => 'b',
name4 => 't',
anzahl => 2
}
];
use Data::Dumper;
foreach( reverse sort { $a->{anzahl} <=> $b->{anzahl} } @$alignment)
{
print Dumper $_;
}
Struppi.