vieviele einträge von Array A befinden sich in Array B?

  • folgendes:
    ich habe 2 arrays, eins mit ca 9500 einträgen und eins mit 15000
    in jeder zeile steht eine sozialversicherungsnummer, sie sind sortiert und es gibt keine leerzeilen oder duplikate innerhalb der arrays
    nun möchte ich wissen, wieviele der zahlen in array A auch in array B sind

    hier die ersten par zeilen zur veranschaulichung

    wie realisiere ich das? es muss möglichst performant sein, da es ja immerhin über 9000 zahlen sind die ich im 2. array suchen muss

    Einmal editiert, zuletzt von Hollywood (27. Mai 2009 um 15:14)

  • mit

    [autoit]


    #Include <Array.au3>
    _ArraySearch(Const ByRef $avArray, $vValue[, $iStart = 0[, $iEnd = 0[, $iCase = 0[, $iPartial = 0[, $iForward = 1[, $iSubItem = 0]]]]]])

    [/autoit]

    solltest du weiterkommen. über eine for schleife prüfst du für jedes element des 1. arrays, ob der wert auch im 2. array vorkommt...

    sind die sozialversicherungsnummern in deinem bsp. echt??? dann hut ab mein freund :)

  • Hab zwar wenig ahnung von arrays , aber du könntest es ja so machen.
    Array B in eine .txt schreiben lassen.
    Dann mit einer For...Next Schleife jeden Array aus A einzeln auslesen und mit dem Dokument vergleichen, ob das enthalten ist.
    Es gibt glaube ich eine Funktion wie Stringcompare (o.ä).
    Und wenn der Compare = 1 ergibt (Also etwas gleiches da ist), dann $Anzahl = $Anzahl+1

    Also dann hat man so einen Ticker.
    Und du könntest dann nebenbei ein GUI offen haben, wo du immer wieder die $Anzahl Variabel anzeigen lässt.
    Nur mal so als Idee


    Mfg

    Benne

  • soweit war ich auch schon, nur dauert das eeeeewig, ich will nciht jeden eintrag von a mit jedem eintrag von b vergleichen, da sie sortiert sind kann ich alles was kleiner als der eintrag von a ist schonmal ignorieren

  • hmm wenn beide sortiert sind musste ja das 2. Array nicht Anzahl vom 1. Array mal durchlaufen lassen

    es reicht ja dann sich zu merken welche Zahl du im 2. Array gefunden hast - diese Merkst du dir und machst dann in der Schleife beim Wert +1 weiter
    dann kannst du ja abfragen ob die Zahl größer ist - somit kannste in der Hauptschleife weitergehen

    eigentlich ganz easy nur 1 Verschachtelung :D

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

    • Offizieller Beitrag

    Hi,

    nicht das schnellste, aber ...

    [autoit]

    #include <Array.au3>
    Global $a[3] = [1,2,3], $b[5] = [1,3,5,7,9]
    _ArrayConcatenate($a, $b)
    $a = _ArrayUnique($a)
    ;~ _ArrayDisplay($a)
    MsgBox(16, '', 'Anzahl : ' & $a[0])

    [/autoit]

    bzw. du willst glaube ich dies:

    [autoit]

    #include <Array.au3>
    Global $a[3] = [1,2,3], $b[5] = [1,3,5,7,9]
    _ArrayConcatenate($a, $b)
    Global $puffer = UBound($a)
    $a = _ArrayUnique($a)
    MsgBox(16, '', 'Anzahl : ' & $puffer - $a[0])

    [/autoit]

    Mega

  • danke für eure hilfe, habs jetzt aber anders gelöst

    [autoit]

    dim $counter1 = 0
    dim $counter2 = 0
    dim $found = 0
    ConsoleWrite("schleife starten" & @lf)
    $max = _ArrayMaxIndex($aSVNR)
    while 1
    if $counter1 = $max then ExitLoop
    if $aSVNR[$counter1] = $bSVNR[$counter2] then
    ConsoleWrite($counter1 & " " & $counter2 & " = " & $aSVNR[$counter1] & " ist " & $bSVNR[$counter2] &" " & $found & @lf)
    $found +=1
    $counter1 +=1
    else
    if $aSVNR[$counter1] > $bSVNR[$counter2] then
    ConsoleWrite($counter1 & " " & $counter2 & " = " & $aSVNR[$counter1] & " ist groesser als " & $bSVNR[$counter2] &" " & $found& @lf)
    $counter2 +=1
    ElseIf $aSVNR[$counter1] < $bSVNR[$counter2] then
    ConsoleWrite($counter1 & " " & $counter2 & " = " & $aSVNR[$counter1] & " ist kleiner als " & $bSVNR[$counter2] & " " & $found & @lf)
    $counter1 +=1
    endif
    endif
    wend

    [/autoit]