Arrays vergleichen
digi
- perl
HI zusammen,
wie kann ich denn elegant/ressourcenschonend zwei Arrays miteinander auf "Doubletten" vergleichen?
Bsp:
@a = (1,5,10,466,1226,22222,...);
@b = (17,65,155,466,1453,5000,22222,...);
Und nun möchte ich eben, dass er mir 466, 22222, usw. ausgibt.
Ich wüsste wie ich es machen könnte, wenn ich einfach 2 foreach-Schleifen gegeneinander laufen lasse, aber ich glaub, dass geht auch besser. Hat jemand ne Idee?
Danke.
cu
digi
Hi digi
eine foreach-Schhleife müsste doch reichen.
Du prüfst einfach jeden Wert aus @a ob er in @b vorhanden ist.
Und wenn Du vorher noch weisst,
welches Array kleiner ist,
dann nimmst Du halt das.
Gruss, Frank
wie kann ich denn elegant/ressourcenschonend zwei Arrays miteinander auf "Doubletten" vergleichen?
How do I compute the difference of two arrays? How do I compute the intersection of two arrays?
Struppi.
Hi,
wie kann ich denn elegant/ressourcenschonend zwei Arrays miteinander auf "Doubletten" vergleichen?
How do I compute the difference of two arrays? How do I compute the intersection of two arrays?
Struppi.
Danke erstmal.
Aber ich verstehe den Inkrement $count{$element}++ nicht. Wird da der Inhalt von array1[0] bis array2[letztes Element] immer um eins hochgezählt? Und wenn ja, wohin wird es gespeichert?
ciao,
digi
Aber ich verstehe den Inkrement $count{$element}++ nicht. Wird da der Inhalt von array1[0] bis array2[letztes Element] immer um eins hochgezählt? Und wenn ja, wohin wird es gespeichert?
Nein, die Elemente werden als Schlüssel in dem HASH %count gespeichert und das vorkommen gezählt. Kommt ein Element zweimal vor ist es in beiden Arrays.
Struppi.
Hallo digi,
Aber ich verstehe den Inkrement $count{$element}++ nicht. Wird da der Inhalt von array1[0] bis array2[letztes Element] immer um eins hochgezählt? Und wenn ja, wohin wird es gespeichert?
Nun die foreach-Schleife geht alle Elemente _beider_ Arrays durch (die beiden werden aneinandergehängt). Dann wird für jedes Element ein neuer Schlüssel im anfangs leeren Hash %count angelegt. Der Wert wird auf 1 gesetzt (0+1). Ist allerdings schon ein Schlüssel vorhanden, d.h. das Arrayelement kam schon mal vor, wird der Wert um eins erhöht. Somit erhält man z.B. sowas:
@arr1 = (1,2,3,1);
@arr2 = (2,4,5);
%count = {
"1" => 2,
"2" => 2,
"3" => 1,
"4" => 1,
"5" => 1
}
Grüße
Jasmin
gudn tach!
mit dem stichwort "intersection" findest du recht fix algorithmen dazu:
z.b.
http://www.unix.org.ua/orelly/perl/cookbook/ch04_09.htm
http://www.chovy.com/perl/finding-an-intersection-between-arrays-in-perl/
oder in speziellen faellen
http://search.cpan.org/dist/Set-IntSpan-Fast/lib/Set/IntSpan/Fast.pm
prost
seth