Probleme mit Arrays

  • Skripte laufen super, ich versuche auch gerade nachzuvollziehen, wie die einzelnen Funktionen und Parameter funktionieren. Klappt auch soweit ganz gut, aber an einer Stelle häng ich grade fest, da liefert mir sowohl Google, wie auch die Hilfe keine Info's.

    $aFound=_ArrayFindAll($aResult_u,$aResult_u[$z][0]);,0,0,0,2)

    Laut Dr. Google und der Hilfe kommt ja als 2. Parameter der zu suchende Wert rein. Woher kommt das $Z bzw was bewirkt das?

    • Offizieller Beitrag
    Zitat von autoBert

    ja jetzt muß nur noch einer per Hand nach rechnen, nicht das Raupi Recht hat. Ich dachte, als das Thema eröffnet wurde, es sei ein 2. Account von Raupi (er hat mal in der SB eine Andeutung in diese Richtung Rift gemacht) und er ist nur zu faul.

    Wat? Was für eine Andeutung?

    Mein 2. Account ist der einzigste im Forum der von Anfang an genehmigt war. RaupiClient.

    Das mit den Leerzeichen hab ich von Anfang an rausgefunden, deshalb habe ich ja StringStripWS benutz um die Leerzeichen zu killen.
    Die Leerzeichen entstehen wenn in einer Zeile kein x zum splitten enthalten ist.

  • Habe gerade gesehen, dass autoBerts Lösung durch den Regex ca. 10x schneller ist als meine Lösung...
    Also habe ich mal nachgerüstet :D (Sollte jetzt ca. 2x schneller sein als autoBerts Lösung)

    lg
    M

  • Stimmt der 2. Parameter ist ein Element des Arrays. $z wurde am Anfang der Func deklariert hat also beim 1. Duchlauf den Wert 0. da $z nach abarbeiten der Suche, evtl. aufaddieren und löschen um 1 erhöht wird jedesmal ein anderes Element abgearbeitet.

    Hier einmal das Teilkonstrukt:

    Code
    Do ;bedingte äußere Schleife
    			$aFound=_ArrayFindAll($aResult_u,$aResult_u[$z][0]);,0,0,0,2)	;ist Element $aResult_u[$z][0] noch öfters vorhanden? 
    			ConsoleWrite($z & '. durchlauf: ' & $aResult_u&@TAB&$aResult_u[$z][0]&@CRLF)	;zu Verständniszwecken
    			_ArrayDisplay($aFound)								;zu Verständniszwecken
    			For $f=UBound($aFound)-1 to 1 Step -1				;alle anderen Funde durchgegeh 
    				$aResult_u[$z][1] += $aResult_u[$aFound[$f]][1]	;und dazuaddieren
    				_ArrayDelete($aResult_u,$aFound[$f])			;danach doppelten Eintrag Löschen
    			Next
    			$z+=1												;Zähler $z um 1 erhöhen
    		Until $z = UBound($aResult_u)							;solange bis alle 1. Vorkommen eines Elements abgearbeitet wurden

    da $z nach abarbeiten der Suche, evtl. aufaddieren und löschen um 1 erhöht wird jedesmal ein anderes Element abgearbeitet.

    Habe gerade gesehen, dass autoBerts Lösung durch den Regex ca. 10x schneller ist als meine Lösung...
    Also habe ich mal nachgerüstet :D (Sollte jetzt ca. 2x schneller sein als autoBerts Lösung)

    lg
    M

    Mit den gegbenen Daten bist du ca. 8 mal schneller. Ich bin aber der Meinung, daß mit zunehmender Datenmenge mein Skript aufholt und irgendwann überholt. Bin aber zu faul ein Testskript zu schreiben.

    2 Mal editiert, zuletzt von autoBert (6. Februar 2016 um 15:11)

    • Offizieller Beitrag

    Ich bin ein bisschen erstaunt, erst wollte keiner helfen und nun gibt es ein Combat wer die beste Lösung hat. :whistling:

  • Ich bin auch sehr verwundert, dass man erst alleine da steht mit seinen Fragen und dann gibts ein Battle, wessen Lösung noch schneller ist *g*

    Wenn ich die beiden "Spalten" vertauschen will (die Zahlen vorne untereinander ist lesbarer), kann ich das mit _arrayswap machen, oder besser mit _arraytranspose?

    • Offizieller Beitrag

    Wenn du die mal die Beispiele zu den beiden Funktionen anschaust, dann beantwortest du dir die Frage selbst ;)

  • Hab das Skript jetzt mal mit einer Log mit 20.000 Zeilen laufen lassen. 5760 Ergebnisse mit "Ihr erhaltet:". Dauer vom 3. Schritt, wo er das Array zusammen addiert ~100 Sek.
    Problem war das _Arraydelete

    Hab mich jetzt mal hingesetzt und mit Bekanntem was gebastelt - ohne ArrayDelete. Außerdem wird jetzt die Anzahl an Materialien zuerst ausgegeben

    Spoiler anzeigen

    Nu braucht er zum Sortieren und Addieren nur noch 2 Sek für die über 5000 Zeilen ;)

    2 Mal editiert, zuletzt von thewanderer (7. Februar 2016 um 16:34)

    • Offizieller Beitrag

    Problem war das _Arraydelete

    Das ist die Problematik der UDF. Die Funktionen sind für einen einzelnen Vorgang konzipiert. Bei mehrfachem Aufruf werden dann unnützerweise immer wieder dieselben (zeitintensiven) Vorgänge gestartet. ReDim als native Funktion ist ebenfalls eine dieser Spaßbremsen. Oft ist es besser auf die UDF zu verzichten, bzw. zeitintensive Funktionen nur ganz gezielt einzusetzen.

  • 2 Sekunden ? Da kann man noch was rausholen :P
    z.B. via Assoziativem Array incl Hashtable, wo die Labels den Items, und der Wert der Anzahl entspricht. Das müsste dann lineare Laufzeit beim Zusammenfassen ergeben. Aber 2 Sek ist schon passabel, daher werde ich hier nicht weiterbasteln ;)

    lg
    M

  • Hab noch ein kleines Problem, hab mir überlegt, daß ich mir eine GUI bastel, in welcher die gesammelten Items immer "live" aktuallisiert werden. Sonst muß ich ständig die .txt öffnen, schließen...

    Dachte, das ist so zu machen, klappt aber nicht... :(

    Spoiler anzeigen

    Zeile 3,4 & 48-50

    Ist dafür Listview überhaupt der richtige Ansatz?

    4 Mal editiert, zuletzt von thewanderer (7. Februar 2016 um 18:39)

  • Ja. Allerdings werden bei Listviews, TreeViews,... Items hinzugefügt.
    (s. Hilfe: GuiCtrlCreateListViewItem). Guck dir einfach unter GuiCtrlCreateListview die Beispiele in der Hilfe an.
    _GuiCtrlListView_DeleteAllItems löscht alle Items, ansonsten Array durchgehen und _GuiCtrlListView_SetItem... ansehen.
    Generell einfach in der Hilfe unter "User Defined Functions->Gui Reference->GuiListView management" mal Blättern. Die Listview hat nen haufen Befehle.

  • Damit bastel ich schon grade rum, hab folgendes in mein Skript eingefügt:

    _GUICtrlListView_AddColumn($Result_List, "", 310)
    _GUICtrlListView_AddArray($Result_List, $aResult_sum)

    aber da gibt er mir nur die Linke Spalte im Fenster aus.

    Mit:
    _GUICtrlListView_AddColumn($Result_List, "", 310)
    _GUICtrlListView_AddArray($Result_List, $aResult_sum[0] & $aResult_sum[1])

    bekomm ich nen Error.
    Such grade mal bei Dr. Google ;)

  • Die Implementation deiner Auswertung in das Beispiel zu _GUICtrlListView_AddArray ist doch ganz einfach:

  • Zeilenfehler in Zeile 35 ???

    AutoIt
    $file_r = StringReplace(StringReplace($file, '[', ''), ']', '')
    
    
    ; wäre nicht folgendes richtig:
    $file_r = StringReplace(StringReplace($file, '[', ')', ']', '')

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Zeilenfehler in Zeile 35 ???

    AutoIt
    $file_r = StringReplace(StringReplace($file, '[', ''), ']', '')
    
    
    ; wäre nicht folgendes richtig:
    $file_r = StringReplace(StringReplace($file, '[', ')', ']', '')

    Da ist kein Fehler drin.
    Alina, das ist nur eine Kombination und sieht einzeln dann so aus:


    AutoIt
    $file_r = StringReplace($file, '[', '')
    $file_r = StringReplace($file_r, ']', '')

    Das soll einfach [ und ] mit nichts ersetzen, sprich löschen.
    Die Klammer ( ist nicht das Ersatzzeichen, sondern schließt den 2. Aufruf von StringReplace ab