Schrift
[thread]11262[/thread]

2 oder mehr arrays vergleichen

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2008-02-07 12:51
#105679 #105679
hallo!

ich brauche ein skript, welches bei 2 oder mehr array jeweils einen bestimmten index miteinander vergleicht und dann ausgibt, welche indizes gleich sind und welche es nur in dem jeweiligen array gibt

jedes array ist schon sortiert. außerdem ist jeder eintrag des array nur noch einmal vorhanden

ich hab keine idee wie ich das anstellen könnte.

das einzige was ich bis jetz über diverse suchmaschinen gefunden habe, ist, wie man zwei gleichlange arrays vergleicht...meine array sind aber unterschiedlich lang..

ich bin über alle vorschläge dankbar die ihr mir geben könnt!

Alex
moritz
 2008-02-07 13:31
#105681 #105681
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Es gibt z.B: CPAN:Array::Diff, das sowas macht.

Ansonsten kannst du wie folgt vorgehen: einen Index für jedes Array speichern, am Anfang auf 0 setzen.
Dann:

1) wenn beide Element gleich sind, beide Indizies um eins erhöhen
2) wenn das element im ersten Array größer ist, den zweiten Index um eins erhöhen, das element des zweiten Arrays ist dann nicht in Array 1
3) wenn das Element im zweiten Array großst, den ersten Index um eins erhöhen, das element dersten arrays ist dann nicht in Array 2.
Struppi
 2008-02-07 14:20
#105682 #105682
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
.
Gast Gast
 2008-02-07 15:59
#105685 #105685
ich hab jetzt mal versucht die variante von moritz umzusetzen....ich brings aber leider nicht zum laufen:(

@moritz: könntest du vielleicht mal nen beispiel-quellcode hier reinstellen, das ich das system zumindest irgendwie verstehe?
moritz
 2008-02-07 16:28
#105686 #105686
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Schreib doch erst mal, was du bisher hast und wo es hakt.

Und gefällt dir Array::Diff nicht? das wäre vermutlich deutlich einfacher für dich.
Gast Gast
 2008-02-07 17:12
#105687 #105687
moritz+2008-02-07 15:28:18--
Und gefällt dir Array::Diff nicht? das wäre vermutlich deutlich einfacher für dich.


soweit ich das verstanden habe, muss ich das "Algorithm::Diff"-Modul erst installieren...das ist aber an dem Rechner an dem ich sitze nicht möglich...

hier ist erstmal der meine Interpretation deines Vorschlages

Code (perl): (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
sub vergleichen
{
  my $x = 0;
  my $y = 0;
  my $vergl_index_1 = 0;
  my $vergl_index_2 = 0;
  while ($x<=$#datei_array)
  {
    while ($y<=$#{$datei_array[$x]})
    {
      my $zaehler_array_2 = $x+1;
      if ($datei_array[$x][$vergl_index_1] eq $datei_array[($x+1)][$vergl_index_2])
      {
        print "$vergl_index_1\n";
        push (@in_allen_arrays, $datei_array[$x][$vergl_index_1]);
        push (@in_allen_arrays, "\n");
        $vergl_index_1++;
        $vergl_index_2++;
      } 
      if ($datei_array[$x][$vergl_index_1] lt $datei_array[($x+1)][$vergl_index_2])
      {
        push (@nur_array_1, $datei_array[$x][$vergl_index_1]);
        push (@nur_array_1, "\n");
        $vergl_index_1++;
      }
      if ($datei_array[$x][$vergl_index_1] gt $datei_array[($x+1)][$vergl_index_2])
      {
        push (@nur_array_2, $datei_array[($x+1)][$vergl_index_2]);
        push (@nur_array_2, "\n");
        $vergl_index_2++;
      }
      $y++;
    }
    $x++;
  }
}


ich muss wohl noch dazu sagen das das "datei_array" bereits aus 2 (oder mehr,falls ich mehrere dateien vergleichen muss) arrays besteht...
deswegen sieht der kopf der funktion auch so wirr aus...oder ich stell mich einfach mal wieder nur zu dumm an:(
murphy
 2008-02-07 17:18
#105688 #105688
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn beide Arrays bereits sortiert und duplikatfrei sind, ist Array::Diff eigentlich Overkill, weil für diesen Spezialfall die Lösung von moritz effizienter sein dürfte.

Code (perl): (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
use 5.008;
use strict;
use warnings;

# Data sample
my @from = (1, 2, 4, 7);
my @to = (1, 3, 4, 5, 7, 8);

# Result
my $count = 0; # number of changes
my @added = (); # elements added in transition from @from to @to
my @removed = (); # elements removed in transition from @from to @to

# Algorithm
my ($i, $j) = (0, 0);
while ($i <= $#from or $j <= $#to) {
  if ($i > $#from or ($j <= $#to and $from[$i] > $to[$j])) {
    $count++;
    push @added, $to[$j++];
  }
  elsif ($j > $#to or ($i <= $#from and $from[$i] < $to[$j])) {
    $count++;
    push @removed, $from[$i++];
  }
  else {
    $i++;
    $j++;
  }
}

# Output
{
  local $" = ', ';
  print "count:   $count\n";
  print "added:   @added\n";
  print "removed: @removed\n";
}
When C++ is your hammer, every problem looks like your thumb.
murphy
 2008-02-07 17:22
#105689 #105689
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-02-07 16:12:40--
[...] soweit ich das verstanden habe, muss ich das "Algorithm::Diff"-Modul erst installieren...das ist aber an dem Rechner an dem ich sitze nicht möglich [...]


Das ist immer möglich: Wiki: Wie installiere ich ein Modul?
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-02-07 17:40
#105690 #105690
murphy+2008-02-07 16:22:59--
Gast+2008-02-07 16:12:40--
[...] soweit ich das verstanden habe, muss ich das "Algorithm::Diff"-Modul erst installieren...das ist aber an dem Rechner an dem ich sitze nicht möglich [...]


Das ist immer möglich: Wiki: Wie installiere ich ein Modul?


ich habs nach der anleitung da oben versucht...
ergebnis: cpan probiert einen link nach dem anderen um das modul runterzuladen....das problem hierbei ist, das das programm garnicht ins internet kommt da der rechner theoretisch keinen internet-zugang hat

ich komm blos mit dem iexplorer ins internet weil man da ein bisschen "nachhelfen" kann
murphy
 2008-02-07 17:55
#105692 #105692
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Gast: Du kannst auch das Modul mit Deinem Webbrowser von CPAN herunterladen und dann von Hand installieren. Oder, wenn Du ActivePerl verwendest, kannst Du das PPM-Paket von ActiveState herunterladen und dann installieren.
When C++ is your hammer, every problem looks like your thumb.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-02-07 12:51.