Schrift
[thread]5911[/thread]

Wieder mal ein Array-Vergleich Problem (Seite 2)

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Crian
 2003-11-17 16:07
#71944 #71944
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Und schon sieht man, dass man sich hier und da vertan hat, aber nach ein paar Testläufen ist das Ergebnis fertig:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl
use diagnostics;
use strict;
use warnings;

use Data::Dumper;# nur für die Ausgabe


my @array1 = ("apfel 752 523 grün",
"birne 448 038 gelb",
"orange 361 098 orange",
);
my @array2 = ("apfel 752 523 grün",
"birne 448 638 gelb",
"zitrone 361 098 gelbgrün",
);
my @diff = ();


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;
}



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, $elem2;
}
}


print "Array 1 :\n", Dumper(\@array1), "\n",
"Array 2 :\n", Dumper(\@array2), "\n",
"Array diff:\n", Dumper(\@diff), "\n";


mit der Ausgabe

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Array 1   :
$VAR1 = [
'apfel 752 523 grün',
'birne 448 038 gelb',
'orange 361 098 orange'
];

Array 2 :
$VAR1 = [
'apfel 752 523 grün',
'birne 448 638 gelb',
'zitrone 361 098 gelbgrün'
];

Array diff:
$VAR1 = [
'birne 448 038 gelb',
'birne 448 638 gelb',
'orange 361 098 orange',
'zitrone 361 098 gelbgrün'
];
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 17:00
#71945 #71945
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Wenn ich deine Funktion mit meinen 2 Arrays, die aus tausenden von Werten bestehen, verwende, passiert überhaupt nix. Die Prozessorauslastung geht auf 100 Prozent und dabei bleibt sie auch...
Wenn ich die Anzahl der Werte auf ein paar reduziere, kommen leider nur vollkommen diffuse Ergebnisse.
Ich möchte dir aber trotzdem vielmals danken, dass du dir so viel Mühe mit dem Ausprogrammieren gemacht hast.

Schönen Gruss.
Arasiel
 2003-11-17 17:24
#71946 #71946
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Ich habe was anderes versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my (@diff, @only_array_1, @only_array_2);
my (%h1, %h2);

$h1{$_} = 1 foreach (@erg1);
$h2{$_} = 1 foreach (@erg2);

a1: foreach my $k1 (keys %h1) {
if( exists $h2{$k1}) {
push @diff, $k1;
delete $h2{$k1};
next a1;
}
push @only_array_1, $k1;
}
#$listbox_right->insert('end', sort @diff); # hier gibt er mir wieder nutzlose Werte aus
$listbox_right->insert('end', "=============Only User 1===================================");
$listbox_right->insert('end', sort@only_array_1);
$listbox_right->insert('end', "==============Only User 2==================================");
$listbox_right->insert('end', sort keys %h2);
$listbox_right->insert('end', "===========================================================");


Damit gibt er mir die Unterschiede zwischen den Arrays aus, aber es wird nicht verglichen, ob es sich
nur um einen Unterschied in den Werten (1. Wort ist gleich, die anderen Worte könen unterschiedlich sein) handel,
oder ob ein Wert in einem Array vorhanden ist und in dem anderen nicht...

Jetzt brauch ich nur noch eine Funktion, damit verglichen wird, ob ein Wert in beiden Arrays nur einmal vorkommt,
oder er in beiden Arrays vorkommt, er aber ab dem 2. Wort unterschiedliche Einträge hat.
Könnte ich jetzt evtl. deine "sub"-Funktion verwenden?
Crian
 2003-11-17 18:34
#71947 #71947
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Arasiel,17.11.2003, 16:00]Wenn ich deine Funktion mit meinen 2 Arrays, die aus tausenden von Werten bestehen, verwende, passiert überhaupt nix. Die Prozessorauslastung geht auf 100 Prozent und dabei bleibt sie auch...
Wenn ich die Anzahl der Werte auf ein paar reduziere, kommen leider nur vollkommen diffuse Ergebnisse.
Ich möchte dir aber trotzdem vielmals danken, dass du dir so viel Mühe mit dem Ausprogrammieren gemacht hast.

Schönen Gruss.[/quote]
Naja, hab etwas Geduld ... wenn Du zwei Arrays mit je 1000 Elementen hast, dann splittet er circa 1000000 mal... das ist nicht im Sinne des Erfinders.
Ich wusste nicht, dass Deine Arrays so groß sind.
In diesem Fall lohnt es sich, die Elemente beider Arrays einmal vorweg zu splitten und die Ergebnisse (nur das erste Wort jeweils) in zwei weiteren Arrays abzulegen, und bei den 1_000_000 Schleifendurchläufen auf diese Arrays zuzugreifen statt immer wieder den selben Kram zu splitten.
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.