Thread doppelte Zeilen
(7 answers)
Opened by gmafx at 2010-02-26 16:44
Wie topeg bereits erläutert hat, verwendet man üblicherweise einen Hash, um sich zu merken, welche "Zeilen" bereits vorkamen und diese dann auszusortieren.
Seine Lösungen bauen darauf auf, dass @liste in jeder "Zeile" mehrere "Spalten" enthält, die Einträge des Arrays also Arrayreferenzen sind. Da du anscheinend mehrere Arrays vorliegen hast - für jede Spalte eines - musst du den Code entsprechend abwandeln, das Prinzip bleibt natürlich dasselbe: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 my @spalte1; my @spalte2; #... my @spalteN; unique( \@spalte1, \@spalte2, ... \@spalteN ); sub unique { my( @cols ) = @_; my %u; for my $i ( reverse 0 .. $#{ $cols[0] } ) { if ( $u{ join( $;, map { $_->[$i] } @cols ) }++ ) { splice( @$_, $i, 1 ) for @cols; } # if } # for } # unique Ich möchte es mal so ähnlich erläutern, wie es im "lila Drachenbuch"(1) erklärt wird: Man möchte herausfinden, ob eine bestimmte Zeile bereits vorhanden ist, und entsprechend darauf reagieren. Zunächst einmal benutzt man eine Liste L, deren Einträge jeweils eine - in diesem Falle unikale - Zeile repräsentieren. Für jede Zeile der Ausgangsdaten verfährt man nun wie folgt: Man durchsucht die Liste L nach einem Eintrag, welcher der jeweiligen Zeile der Ausgangsdaten entspricht. Da mehrfach auftauchende Zeilen lediglich entfernt werden sollen, kann man bei einem Fund, eventuell die aktuelle Zeile einfach nicht in die Liste L eintragen und diese als Ergebnis verwenden, oder aber die Ausgangsdaten verändern, also bei einem Fund die aktuelle Zeile aus den Ausgangsdaten entfernen. Enthält die Liste L noch keinen entsprechenden Eintrag, so wird die aktuelle Zeile dieser angefügt. Allerdings ist es unpraktisch für jede Zeile der Ausgangsdaten, die gesamte Liste L nach einem identischen Eintrag zu durchsuchen, deshalb verwendet man einen Hash dessen Schlüssel den Einträgen der Liste L entsprechen. Bei der Suche nach einer identischen Zeile kann man nun überprüfen, ob der Hash bereits einen solchen Schlüssel enthält. MfG (1) Aho, Alfred u. a. (2007): Compilers:Principles, Techniques, and Tools: International Edition. 2. Auflage. (1986). Pearson Education. S. 360. perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
|