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

Wieder mal ein Array-Vergleich Problem

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Arasiel
 2003-11-17 09:57
#71934 #71934
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich vergleiche 2 Arrays, wie ich schon letzte Woche gepostet habe, mit folgenden Algorithmus, um
die symmetrische Differenz zwischen den beiden Arrays zu bekommen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
my @union = my @isect = my @diff = ();
my %union = my %isect = ();
my %count = ();
my $e;

foreach $e (@erg1, @erg2)
{
$count{$e}++
}

foreach $e(sort(keys %count))
{
push(@union, $e);

if ($count{$e} == 2)
{
push @isect, $e;
}
else
{
push @diff, $e;
}
}

$listbox_right->insert('end', @diff);


Jetzt habe ich aber erneut ein Problem:
Das gibt mir zwar in die Listbox alle, nicht gleichen Arrayelemente aus, aber ich müsste meine Listboxausgabe
noch folgendermassen anpassen.
Und zwar soll mir das Programm die Arrayelemente ausgeben, die nur in Array1 (=@erg1) vorhanden sind,
diejenigen, die nur in Array2 (=@erg2) vorhanden sind und diejenigen, die in Array1 und Array2 vorkommen sich aber
in einem Teil des Strings unterscheiden.

z.B. Ausgaben bis jetzt:
------------------------
"rp5478 rp5478 bfhf797 TTgu08nd fkue" # Array1
"rp5478 rp5478 bfhf797 TTgu08nd ----" # Array2
--> Dieses Element ist in beiden Arrays enthalten, und unterscheidet sich nur in einem Teilstring. Daher sollen sie in den Array @diff;

"rr67309 ewlj 898 ewidf sdföjds sdölj" # Array1
--> dieser String ist in Array2 gar nicht vorhanden, daher soll er in den Array @only_array1;

"khdfgfkhgh 97kl dfkjgldfkj ldfgjklg" # Array2
--> dieser String ist in Array1 gar nicht vorhanden, daher soll er in den Array @only_array2;

Ist ein solcher Vergleich mit dem obig genannten Algorithmus möglich bzw. wie muss ich ihn anpassen um
zum gewünschten Ergebniss zum kommen?

Die Ausgabe soll dann folgendermassen lauten:
---------------------------------------------
Code: (dl )
1
2
3
4
5
6
7
8
$listbox_right->insert('end', "Nur in Array1 enthalten");
$listbox_right->insert('end', @only_array1);

$listbox_right->insert('end', "Nur in Array2 enthalten");
$listbox_right->insert('end', @only_array2);

$listbox_right->insert('end', "Unterschiede");
$listbox_right->insert('end', @diff);


Vielen Dank im Voraus für die Hilfe!

Schönen Gruss!
renee
 2003-11-17 11:34
#71935 #71935
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
definier doch bitte mal genauer, ab wann nur ein unterschied besteht und wann ein eintrag nicht vorhanden ist...

muss mindestens das erste "wort" gleich sein, damit es "nur" unterschiedlich ist??

Bsp.:
Hier ist nur ein Unerschied:
rp5478 rp5478 bfhf797 TTgu08nd fkue => rp5478 rp5478 bfhf797 TTgu08nd ----

Ist das auch nur ein Unterschied(?):
rp5478 rp5478 bfhf797 TTgu08nd fkue => rp5478 ------ ------- -------- ----
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Arasiel
 2003-11-17 11:44
#71936 #71936
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Hallo,

sorry, hab ich wohl vorher etwas unverständlich formuliert.
Ein Unterschied besteht, wenn das erste "Wort" gleich ist und ein Eintrag ist in einem Array vorhanden, aber in dem anderen nicht, wenn das erste "Wort" nicht gleich ist.

Gruss.
Crian
 2003-11-17 12:22
#71937 #71937
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Also ... ich versuch das mal zusammen zu fassen:

Du hast zwei Arrays, in denen befinden sich Strings. Diese Strings bestehen aus Worten (d.h. man könnte sie nach Whitespace splitten).

Wenn zwei Einträge der Arrays mit dem selben Wort beginnen, dann sagen wir, sie kommen in beiden Arrays vor, anderenfalls kommen sie nur in einem der beiden Arrays vor, im anderen nicht.

Zwei Einträge sind genau dann gleich, wenn sie in beiden Arrays vorkommen (nach obiger Definition) und alle "Worte" der beiden Einträge gleich sind. [die Reihenfolge der Worte muss auch gleich sein, nehme ich an?!]

passt das so?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Arasiel
 2003-11-17 12:35
#71938 #71938
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Die Zusammenfassung ist vollkommen korrekt.
Zwei Einträge sind gleich, wenn alle Worte gleich sind + die Reihenfolge passt.
Wenn man sich das so überlegt klingt dass, zumindest für mich, unglaublich kompliziert...
Aber das ist bestimmt irgendwie lösbar oder?
Crian
 2003-11-17 12:38
#71939 #71939
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ja, ich wollte nur vorher wissen, ob ich es richtig verstanden habe :-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2003-11-17 12:44
#71940 #71940
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wie immer bei komplexen Problemen fängt man an, sie in handliche Happen zu teilen, bis man diese lösen kann.

Pseudocode:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Schleife über alle Elemente aus Array 1
   Ist dieses Element in beiden Arrays?
       Ja: Sind diese Elemente gleich?
           Ja: Ok, wir brauchen es nicht in der Ausgabe
           Nein: Schreibe beide Elemente in das Array diff
       Nein: Nur in Array1, ok, schreibs ins Array diff
Ende der Schleife über die Elemente aus Array1

Schleife über alle Elemente aus Array 2
   Ist dieses Element in beiden Arrays?
       Ja: Ok nichts zu tun, das wurde in der ersten Schleife schon
mit erfasst
       Nein: Nur in Array2, ok, schreibs ins Array diff
Ende der Schleife über die Elemente aus Array2


Nun haben wir nette Teilstücke, die leicht in Perl umsetzbar sein sollten.

Wenn Du damit Probleme hast frag wieder nach, dann helf ich gern bei der Umsetzung.\n\n

<!--EDIT|Crian|1069065913-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Arasiel
 2003-11-17 13:47
#71941 #71941
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Okay danke, ich versuchs mal mit der Umsetzung...
Arasiel
 2003-11-17 15:09
#71942 #71942
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Ich glaub ich bin zu dumm zum Umsetzen deines Pseudocodes!
Ich habe schon wieder so viel ausprobiert, aber nix von meinem Algorithmus will funktionieren...
Ich habe wieder alles gelöscht bis auf folgendes:
Code: (dl )
1
2
3
4
	for (my $i = 0; $i < @erg1; $i++)
{
$exists = grep /$erg1[$i]/, @erg2;
}

Auch wenn ich das aktuelle Element von Array1 mit Array2 vergleichen will (ohne grep, mit eq), macht der Rechner nicht mehr mit...
Crian
 2003-11-17 15:54
#71943 #71943
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Hmmm... probieren wir's mal...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Schleife über alle Elemente aus Array 1
  Ist dieses Element in beiden Arrays?
      Ja: Sind diese Elemente gleich?
          Ja: Ok, wir brauchen es nicht in der Ausgabe
          Nein: Schreibe beide Elemente in das Array diff
      Nein: Nur in Array1, ok, schreibs ins Array diff
Ende der Schleife über die Elemente aus Array1

Schleife über alle Elemente aus Array 2
  Ist dieses Element in beiden Arrays?
      Ja: Ok nichts zu tun, das wurde in der ersten Schleife schon
          mit erfasst
      Nein: Nur in Array2, ok, schreibs ins Array diff
Ende der Schleife über die Elemente aus Array2


=>

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
for my $elem (@array1) {
   my $elem2 = ist_element_in_array($elem, \@array2)
   if (defined $elem2) {
       if ($elem eq $elem2) {
           #Ja: Ok, wir brauchen es nicht in der Ausgabe
       }
       else {
           #Nein: Schreibe beide Elemente in das Array diff
           push @diff, ($elem, $elem2);
       }
   }
   else {
       # Nein: Nur in Array1, ok, schreibs ins Array diff
       push @diff, $elem;
   }
}

for my $elem2 (@array2) {
   if (ist_element_in_array($elem2, \@array1)) {
       # Ja: Ok nichts zu tun, das wurde in der ersten Schleife
       # schon mit erfasst
   }
   else {
       # Nein: Nur in Array2, ok, schreibs ins Array diff
       push @diff, $elem;
   }
}


jetzt musst Du noch die Funktion ist_element_in_array() mit Leben füllen. Diese bekommt das Element und eine Referenz auf das Array... sie sieht also ca. so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub ist_element_in_array ($$) {
   my $elem  = shift;
   my $array = shift;

   my $elem_wort = (split / /, $elem)[0];

   for my $aelem (@$array) {
       my $array_wort = (split / /, $aelem)[0];
       if ($elem_wort eq $array_wort) {
           return $aelem;
       }
   }

   return undef;
}


nun testet man das ganze ... (kommt gleich in nächstem Posting)\n\n

<!--EDIT|Crian|1069078211-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2003-11-17 09:57.