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

Array auf Duplikate überprüfen

Leser: 4


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
javalinnn
 2007-11-20 21:07
#102672 #102672
User since
2007-11-20
3 Artikel
BenutzerIn
[default_avatar]
Hi Leute,
ich habe einen Array, in dem ca 900 Bibtexkeys (also Strings) gespeichert sind und möchte Duplikate ausfindig machen.

Bin dabei bisher nicht auf den grünen Zweig gekommen, mein bisheriger Versuch sieht so aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
 

for ($i=0; $i<= $#allkeys; ++$i){
        @join="";
        if ($allkeys[$i] == $allkeys[$j]) {
                unless ($i == $j) {
                do something
                }
        }
        $i++;
        $j = $j-1;
}


Ich wäre für jede Hilfe dankbar!
lichtkind
 2007-11-20 21:15
#102673 #102673
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
pq++ zeigt mir mal das man die eigenschaft der hashes dafür nutzen kann das dort schlüssel einmalig sein müssen.

Code (perl): (dl )
1
2
my %seen;
my @uniq = grep { !$seen{$_}++ } @allkeys;


grep iteriert ebenfalls durch alle elemente von @allkeys, dabei wird jedesmal der inhalt des aktuellen elementes ($_) als key im hash %seen benutzt und der wert dieses schlüssels um 1 erhöht (++). grep gibt aber nur die werte von $_ weiter, für die die Auswertung des Terms in den {} ein positives ergebniss liefert. Und dank des !, ist das ergebnis nur positiv wenn der hashwert leer war, also nur das erste mal bei jedem wert des arrays.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pq
 2007-11-20 21:50
#102678 #102678
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
lichtkind: das wollt ich auch als antwort schreiben, diesmal warst du schneller =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
javalinnn
 2007-11-20 22:04
#102679 #102679
User since
2007-11-20
3 Artikel
BenutzerIn
[default_avatar]
das heißt, dass in @uniq alle elemente gespeichert werden, die nur einmal vorkommen, oder? wo landen die anderen elemente?

muss ich mit den %seen-hash noch irgendwas machen? oder ist das so schon der vollständige code?
#Kein Kommentar
 2007-11-20 22:16
#102680 #102680
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
in dem array @uniq landen alle elemente aus dem array @allkey.
nur die werte, die schon in dem array @uniq drin sind, kommen nicht nochmal durch.
beispiel von oben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
my @allkeys = qw (hallo ciao hi hallo hello hi);
my %seen;

my @uniq = grep { !$seen{$_}++ } @allkeys;

print "@uniq";

# Ausgabe: hallo ciao hi hello


das %seen-hash war nur dazu da, um sich zu merken, das welches element schon einmal gefunden wurde.
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
javalinnn
 2007-11-20 23:05
#102686 #102686
User since
2007-11-20
3 Artikel
BenutzerIn
[default_avatar]
Cool, soweit war das schonmal sehr hilfreich!

Allerdings müsste ich auf die Teile zugreifen können, die nicht im @uniq Array gelandet sind. Weil die möchte ich ja evtl umbenennen, um sie problemlos weiterverarbeiten zu können. Gbt es dafür eine Lösung?
lichtkind
 2007-11-20 23:42
#102690 #102690
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
der alte @allkeys; bleibt ja nicht angetastet und das %seen kannst ja mit undef nach dem filter auch wieder löschen.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
pq
 2007-11-21 12:16
#102696 #102696
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
javalinnn+2007-11-20 22:05:47--
Allerdings müsste ich auf die Teile zugreifen können, die nicht im @uniq Array gelandet sind. Weil die möchte ich ja evtl umbenennen, um sie problemlos weiterverarbeiten zu können. Gbt es dafür eine Lösung?

bitte drück dich klarer aus, was du machen willst. und versuche, die lösung mit %seen zu
verstehen.
was genau meinst du mit "Weil die möchte ich ja evtl umbenennen"?
die strings, die mehrfach vorkommen, stehen als keys in %seen. wenn dir eine strategie
einfällt, um die strings umzubenennen, dann überleg dir, wie du das in die schleife
einbaust. (das grep ist ja im prinzip eine schleife, du kannst eine for-schleife draus machen
und den notwendigen umbennenungscode einbauen).

indem du genau formulierst, was du machen willst, hast du schon einen grossen teil der
lsung und lernst dabei mehr, als hier die lösung vorgesetzt zu bekommen.
also, wie sieht das array aus und was genau möchtest du als ergebnis haben?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Siechfred
 2007-11-21 14:24
#102712 #102712
User since
2007-11-12
30 Artikel
BenutzerIn
[default_avatar]
Quote
Allerdings müsste ich auf die Teile zugreifen können, die nicht im @uniq Array gelandet sind. Weil die möchte ich ja evtl umbenennen, um sie problemlos weiterverarbeiten zu können. Gbt es dafür eine Lösung?


Wenn ich Dich richtig verstehe, sollte map helfen, z.B. indem Du an mehrfach vorkommende Elemente einfach die Anzahl des Vorkommens dranhängst:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
my @allkeys = qw (hallo ciao hi hallo hi hello hi);
my %seen;
my @new_array = map ( renameElm($_), @allkeys );
print "@new_array";

sub renameElm {
  my $elm = shift;
  $elm .= $seen{$elm} if( $seen{$elm}++ );
  return $elm;
}


Das produziert dann "hallo ciao hi hallo2 hi2 hello hi3".

HTH,
Siechfred
pq
 2007-11-21 14:41
#102720 #102720
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
siechfred: renameElm() bekommt eine variable übergeben und benutzt eine andere "globale"
variable. bitte beide variablen als argumente übergeben, sonst ist das schlechter stil.
(jaja, mecker, mecker, es ist nur so, dass ich schon eine ganze menge skripte bearbeiten
durfte, die mal jemand anderes geschrieben hat (oder ich, als ich noch schlechter
programmierte), und wenn man sich bestimmte sachen erst gar nicht angewöhnt (globale
variablen benutzen, wo es überhaupt nicht notwendig ist), erleichtert das dir und anderen
das leben sehr)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-11-20 21:07.