hash sortieren
am 24.02.2006 10:32:42 von info
Hi!
Habe ein Sortierproblem mit einem dreidimensionalen Hash. Und zwar brauche
ich in einer äußeren Schleife die Keys der ersten Dimension:
foreach my $nr (keys %schiff) {
}
Diese sollen aber sortiert sein nach der dritten Dimension, eigentlich so:
foreach my $nr (sort {$schiff{$nr}{'FOO'}{$b} <=> $schiff{$nr}{'FOO'}{$a}}
keys %schiff) {
}
Natürlich geht das nicht, weil er $a und $b immer nur für $nr anschaut.
Wie muss ich das denn jetzt aufbauen?
Kommt da eine "map" in Frage?
Kann mir bitte jemand auf die Sprünge helfen?
Grüße
--
MICHAEL DÖRING
Re: hash sortieren
am 24.02.2006 10:46:26 von Frank Seitz
Michael Döring wrote:
> Habe ein Sortierproblem mit einem dreidimensionalen Hash. Und zwar brauche
> ich in einer äußeren Schleife die Keys der ersten Dimension:
>
> foreach my $nr (keys %schiff) {
> }
>
> Diese sollen aber sortiert sein nach der dritten Dimension, eigentlich so:
>
> foreach my $nr (sort {$schiff{$nr}{'FOO'}{$b} <=> $schiff{$nr}{'FOO'}{$a}}
> keys %schiff) {
> }
>
> Natürlich geht das nicht, weil er $a und $b immer nur für $nr anschaut.
$a und $b müssten daher dort stehen, wo $nr steht.
Wenn die dritte Dimension nicht eindeutig bestimmt ist,
sehe ich nicht, wie Du da sortieren willst.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: hash sortieren
am 24.02.2006 10:56:47 von info
"Frank Seitz" schrieb im Newsbeitrag
news:4682vjF9rscuU2@individual.net...
> Michael Döring wrote:
>
>> Habe ein Sortierproblem mit einem dreidimensionalen Hash. Und zwar
>> brauche
>> ich in einer äußeren Schleife die Keys der ersten Dimension:
>>
>> foreach my $nr (keys %schiff) {
>> }
>>
>> Diese sollen aber sortiert sein nach der dritten Dimension, eigentlich
>> so:
>>
>> foreach my $nr (sort {$schiff{$nr}{'FOO'}{$b} <=>
>> $schiff{$nr}{'FOO'}{$a}}
>> keys %schiff) {
>> }
>>
>> Natürlich geht das nicht, weil er $a und $b immer nur für $nr anschaut.
>
> $a und $b müssten daher dort stehen, wo $nr steht.
> Wenn die dritte Dimension nicht eindeutig bestimmt ist,
> sehe ich nicht, wie Du da sortieren willst.
Wenn $a und $b dort stehen, wo $nr steht, sortiert er nach den keys der
ersten Dimension. Das möchte ich ja nicht. Er soll nach den keys der dritten
Dimension sortieren.
Mir ist auch klar, dass es wahrscheinlich mit dieser einfachen Syntax nicht
gehen wird. Deshalb ja schon die Idee mit einer MAP. Aber davon habe ich
nicht die geringste Ahnung, wie man das hier anwenden müsste.
Bitte um Hilfe.
Grüße
Re: hash sortieren
am 24.02.2006 11:10:56 von Frank Seitz
Michael Döring wrote:
> Bitte um Hilfe.
Wahrscheinlich läßt sich das am ehesten klären, wenn
Du mal ein Beispiel gibst, sprich: konkrete Daten
und wie Du sie gerne sortiert hättest.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: hash sortieren
am 24.02.2006 11:23:43 von info
"Frank Seitz" schrieb im Newsbeitrag
news:4684dhF9rscuU3@individual.net...
> Michael Döring wrote:
>
>> Bitte um Hilfe.
>
> Wahrscheinlich läßt sich das am ehesten klären, wenn
> Du mal ein Beispiel gibst, sprich: konkrete Daten
> und wie Du sie gerne sortiert hättest.
Der Hash hat diesen Aufbau:
{NR}{KAT}{ART}
NR = fortlaufende Nummer (soll später je eine Zeile in der Tabelle werden)
KAT = Kategorie (soll später je eine Spalte in der Tabelle werden)
ART = Unterart der Kategorie, quasi eine Unterkategorie (soll später je eine
Zeile in einer Kategorie-Zelle werden)
Der Aufbau der Tabelle (ist gleich dem benötigten SORT) soll nun so
erfolgen, dass nach KEYS von {ART} in der Kategorie 'SCH' aufsteigend
sortiert angezeigt wird, also quasi $schiff{...}{'SCH'}{$a} <=>
$schiff{...}{'SCH'}{$b}
'SCH' ist dabei ein fester Name einer Kategorie, steht für "Schiff", könnte
auch 'FOO' sein, eine Konstante halt.
Hab ich das ordentlich erklärt?
Grüße und Danke für die Bemühungen!
Michael
Re: hash sortieren
am 24.02.2006 11:37:09 von Christian Lackas
* Michael Döring [2006-02-24]:
Hallo Michael,
> Habe ein Sortierproblem mit einem dreidimensionalen Hash. Und zwar brauche
> ich in einer äußeren Schleife die Keys der ersten Dimension:
gib beim nächsten Mal doch bitte ein minimales aber komplettes Beispiel
dafür an was du machen möchtest. Es ist deutlich einfacher, wenn du
%schiff direkt mit vorgibst, statt dass sich jeder hier erstmal selbst
was zusammenbasteln muss (was dann vielleicht noch nichtmal passt).
Ich gehe jetzt von folgendem aus:
my %schiff = (
901 => { FOO => 1 },
802 => { FOO => 2 },
703 => { FOO => 3 }
);
> Diese sollen aber sortiert sein nach der dritten Dimension, eigentlich so:
> foreach my $nr (sort {$schiff{$nr}{'FOO'}{$b} <=> $schiff{$nr}{'FOO'}{$a}}
> keys %schiff) {
> }
Wenn du die dritte Dimension vergleichen willst, dann doch so:
foreach my $nr (sort { $schiff{$a}{FOO} <=> $schiff{$b}{FOO} } keys %schiff) {
print Dumper $schiff{$nr};
}
Bei dir gibst du doch schon drei Keys vor und deren Wert wäre dann ja
schon Ebene vier. Dann müßte Ebene drei aber auch konstant sein (wie das
'FOO').
Andernfalls muss es noch ein Kriterium geben, was du uns noch nicht
mitgeteilt hast.
Gruß
Christian
--
Murphys Law 17: Wenn Architekten so bauen würden, wie Programmierer
ihre Programme machen, könnte ein einziger Specht ganze Städte zerstören.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: hash sortieren
am 24.02.2006 11:55:24 von info
"Christian Lackas" schrieb im Newsbeitrag
news:20060224T103216@lackas.net...
> Ich gehe jetzt von folgendem aus:
>
> my %schiff = (
> 901 => { FOO => 1 },
> 802 => { FOO => 2 },
> 703 => { FOO => 3 }
> );
>
>> Diese sollen aber sortiert sein nach der dritten Dimension, eigentlich
>> so:
>> foreach my $nr (sort {$schiff{$nr}{'FOO'}{$b} <=>
>> $schiff{$nr}{'FOO'}{$a}}
>> keys %schiff) {
>> }
>
> Wenn du die dritte Dimension vergleichen willst, dann doch so:
>
> foreach my $nr (sort { $schiff{$a}{FOO} <=> $schiff{$b}{FOO} } keys
> %schiff) {
> print Dumper $schiff{$nr};
> }
>
So ist die Lage der Daten:
SCH=4
ANT=0
GEN=8
DEF=10
WAF=6,8
SCH=1
ANT=6
GEN=1
DEF=1
WAF=9
SCH=4
ANT=0
GEN=8
DEF=10
WAF=6,8,8
Beispiele:
$schiff{2}{SCH}{1} = 1
$schiff{3}{SCH}{4} = 1
$schiff{3}{WAF}{6} = 1
$schiff{3}{WAF}{8} = 2
Deine Vorschlag angewandt:
foreach my $nr (sort {$schiff{$a}{'SCH'} <=> $schiff{$b}{'SCH'}} keys
%schiff) {}
Funktioniert leider nicht. Er sortiert 3 - 2 - 1 statt 2 - 1 - 3 oder 2 -
3 - 1 (letzteren beiden sind egal, Hauptsache, die 2 kommt nach vorne, weil
das KEY $schiff{2}{SCH}{ --> 1 <-- } mit dem Wert 1 am kleinsten ist.
Grüße
Re: hash sortieren
am 24.02.2006 13:23:58 von Christian Lackas
* Michael Döring [2006-02-24]:
Hallo Michael,
> So ist die Lage der Daten:
und du erwartest jetzt von mir, dass ich daraus einen Hash zum
ausprobieren baue?
Wenn du möchtest, dass dir jemand hilft, dann mach es ihm doch bitte so
einfach wie möglich das zu tun. Wenn du den Hash schon hast, dann
schreib ihn doch z.B. einfach mit Data::Dumper raus und zeig ihn hier.
*Mir* ist das jedenfalls zu blöd meine Zeit damit zu verschwenden deine
Daten in einen Hash zu tippen. Aber vielleicht findest du ja jemand
anderen, der dir deine Arbeit abnimmt.
> SCH=4 ANT=0 GEN=8 DEF=10 WAF=6,8
> SCH=1 ANT=6 GEN=1 DEF=1 WAF=9
> SCH=4 ANT=0 GEN=8 DEF=10 WAF=6,8,8
> Beispiele:
> $schiff{2}{SCH}{1} = 1
> $schiff{3}{SCH}{4} = 1
> $schiff{3}{WAF}{6} = 1
> $schiff{3}{WAF}{8} = 2
> Deine Vorschlag angewandt:
> foreach my $nr (sort {$schiff{$a}{'SCH'} <=> $schiff{$b}{'SCH'}} keys
> %schiff) {}
> Funktioniert leider nicht. Er sortiert 3 - 2 - 1 statt 2 - 1 - 3 oder 2 -
> 3 - 1 (letzteren beiden sind egal, Hauptsache, die 2 kommt nach vorne, weil
> das KEY $schiff{2}{SCH}{ --> 1 <-- } mit dem Wert 1 am kleinsten ist.
Kann ich hier nicht nachvollziehen. In dem von mir geposteten
(kompletten) Beispiel wurde korrekt aufsteigend nach der dritten Ebene
sortiert. Hast du das mal ausprobiert?
Meine Ausgabe ist jedenfalls:
$VAR1 = { 'FOO' => 1 };
$VAR1 = { 'FOO' => 2 };
$VAR1 = { 'FOO' => 3 };
Falls du das wilde Rumraten nicht durch Posten von komplettem Code
(siehe mein Beispiel, das ist wirklich nicht viel gewesen) beenden
möchtest, würde ich mich an dieser Stelle ausklinken.
Gruß
Christian
--
Die fünf Sinne: Unsinn, Wahnsinn, Blödsinn, Schwachsinn, Stumpfsinn.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: hash sortieren
am 24.02.2006 15:28:28 von Frank Seitz
Michael Döring wrote:
> Beispiele:
> $schiff{2}{SCH}{1} = 1
> $schiff{3}{SCH}{4} = 1
> $schiff{3}{WAF}{6} = 1
> $schiff{3}{WAF}{8} = 2
Was Du sortieren möchtest, ist keine Liste, sondern ein Baum.
Du müsstest die Baumstruktur erstmal in eine Liste
überführen, um mit sort() arbeiten zu können, z.B in sowas:
([2,'SCH',1],[3,'SCH',4],...)
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel