UDF-Sammlung Array Alternativen

    • Offizieller Beitrag

    Hi,
    nachdem ich bereits zum Dictionary-Objekt als Array-Pendent eine Funktionssammlung erstellt hatte, habe ich mich nun darangesetzt und auch die anderen Arrayalternativen in eine Sammlung aufgenommen. Damit alles komplett ist, habe ich hier nochmal die Dictionary-Funktionen mit erfaßt.

    Mein ausdrücklicher Dank gilt an dieser Stelle AspirinJunkie :thumbup:
    Durch seine gute Vorarbeit hier hat er mich zum Einen inspiriert und zum Anderen die Arbeit spürbar erleichtert 8o .
    Ohne seinen Beitrag hätte ich mich wahrscheinlich nicht so schnell mit diesen Varianten befaßt.

    Obwohl ich weitestgehend getestet habe, bin ich mir nicht ganz sicher ob noch Bugs versteckt sind ;-). Solltet ihr welche entdecken sagt mir bitte Bescheid. :whistling:

    Hier eine Auflistung aller Funktionen der Sammlung:

    Alternative Array-Funktionen


    ============================= OBJEKT 'Scripting.Dictionary' =======================================

    _ObjDictCreate(Modus)
    Erzeugt ein Dictionary Objekt im Binär- (default) oder Textmodus
    Gibt das Handle des Objektes zurück

    _ObjDictAdd(Objekt, Schlüssel, Wert)
    Fügt einem Dictionary Objekt ein Schlüssel-Wert Paar hinzu

    _ObjDictGetValue(Objekt, Schlüssel)
    Liest den Wert für einen Schlüssel aus

    _ObjDictSetValue(Objekt, Schlüssel)
    Setzt einen neuen Wert für einen Schlüssel

    _ObjDictCount(Objekt)
    Gibt die Anzahl der Schlüssel-Wert Paare zurück

    _ObjDictSearch(Objekt, Schlüssel)
    Prüft ob der Schlüssel existiert, liefert 'TRUE' wenn gefunden

    _ObjDictDeleteKey(Objekt, Schlüssel)
    Löscht den angegebenen Schlüssel (und dessen Wert)
    Wird statt eines Schlüsselnamens ein Leerstring übergeben,
    werden alle Schlüssel gelöscht (Standard)

    _ObjDictList(Objekt)
    Eine GUI mit einem ListView zeigt alle Schlüssel-Wert Paare

    _IniReadSectionToObjDict(Objekt, INI-Pfad, Sektion)
    Liest die angegebene INI-Sektion in das Objekt
    Gibt die Anzahl der gelesenen Schlüssel-Wert Paare zurück

    _IniWriteSectionFromObjDict(Objekt, INI-Pfad, Sektion)
    Schreibt die Schlüssel-Wert Paare des Objekts in die angegebene Sektion
    der INI-Datei
    Gibt die Anzahl der geschriebenen Schlüssel-Wert Paare zurück

    _FileReadToObjDict(Objekt, TextDatei-Pfad, Seperator)
    Liest aus einer Textdatei alle Schlüssel-Wert Paare zeilenweise ein (1 Paar/Zeile)
    Standard-Seperator ist '|', kann hier angepaßt werden
    Gibt die Anzahl der gelesenen Schlüssel-Wert Paare zurück

    _FileWriteFromObjDict(Objekt, TextDatei-Pfad, Seperator, Overwrite)
    Schreibt die Schlüssel-Wert Paare des Objekts in die angegebene Datei (1 Paar/Zeile).
    Mit Overwrite='TRUE' (Standard) wird die angegebene Datei, falls sie bereits existiert,
    überschrieben. Mit 'FALSE' wird an eine bestehende Datei angehängt.
    Standard-Seperator ist '|', kann hier angepaßt werden.
    Gibt die Anzahl der geschriebenen Schlüssel-Wert Paare zurück

    ===================================================================================================

    _ObjGetType($Object)
    Gibt die exakte Objektbezeichnung des verwendeten NET-Framework Objektes zurück

    Alle folgenden Funktionen erfordern das NET-Framework.

    ======================== OBJEKT 'System.Collections.Hashtable' ====================================

    _ObjHashCreate()
    Erzeugt ein Hashtable Objekt
    Gibt das Handle des Objektes zurück

    _ObjHashAdd(Objekt, Schlüssel, Wert)
    Fügt einem Hashtable Objekt ein Schlüssel-Wert Paar hinzu

    _ObjHashGetValue(Objekt, Schlüssel)
    Liest den Wert für einen Schlüssel aus

    _ObjHashCount(Objekt)
    Gibt die Anzahl der Schlüssel-Wert Paare zurück

    _ObjHashSearch(Objekt, Schlüssel)
    Prüft ob der Schlüssel existiert, liefert 'TRUE' wenn gefunden

    _ObjHashDeleteKey(Objekt, Schlüssel)
    Löscht den angegebenen Schlüssel (und dessen Wert)
    Wird statt eines Schlüsselnamens '' übergeben,
    werden alle Schlüssel gelöscht (Standard)

    =========================== OBJEKT 'System.Collections.ArrayList' =================================

    _ObjAListCreate()
    Erzeugt ein Arraylist-Objekt

    _ObjAListAdd(Objekt, Wert)
    Fügt einen Wert zum Arraylist-Objekt hinzu

    _ObjAListAddColl(Objekt, Collektion, Trennzeichen)
    Fügt ein 1D-Array oder durch Trennzeichen getrennten String dem Objekt hinzu

    _ObjAListSort(Objekt, Richtung)
    Sortiert alle Elemente des Objekts (Standard: aufsteigend)

    _ObjAListToLine(Objekt, Trennzeichen)
    Gibt einen String mit allen Elementen, getrennt durch Trennzeichen (Standard '|'), zurück

    _ObjAListGetItem(Objekt, Index)
    Gibt den Inhalt an der Indexposition zurück

    _ObjAListDelByName(Objekt, Wert)
    Löscht den ersten gefundenen Eintrag, der mit Wert übereinstimmt

    _ObjAListDelByIndex(Objekt, Index)
    Löscht den Eintrag am übergebenen Index

    _ObjAListInsert(Objekt, Wert, Index)
    Fügt einen Wert am gegebenen Index ein

    _ObjAListCount(Objekt)
    Gibt die Anzahl der Elemente im Objekt zurück

    _ObjAListSearch(Objekt, Wert)
    Gibt TRUE zurück, wenn Wert im Objekt enthalten, sonst FALSE

    _ObjAListClear(Objekt)
    Löscht alle Elemente aus der Arrayliste

    _ObjAListAddRange(Objekt Arraylist, Objekt das hinzugefügt werden soll)
    Fügt ein (gleichartiges) Objekt an die Arraylist an

    _ObjAListToArray(Objekt)
    Übergibt alle Elemente der Arraylist an ein 1D-Array

    _ObjAListGetIndex(Objekt, Wert)
    Gibt den Index des ersten gefundenen Eintrags zurück, der mit Wert übereinstimmt

    _ObjAListGetRange(Objekt, Index, Anzahl)
    Gibt ab Indexposition eine Anzahl Elemente als Objekt zurück

    _ObjAListInsertRange(Objekt, EinfügeObjekt, Index)
    Fügt an der Indexposition ein (gleichartiges) Objekt ein

    _ObjAListLastIndexOf(Objekt, Wert, Von, Bis)
    Gibt den nullbasierten Index des letzten Vorkommens eines Werts in der ArrayList bzw. in einem Abschnitt davon zurück.

    _ObjAListRemoveRange(Objekt, Index, Anzahl)
    Löscht eine Anzahl Elemente ab Indexposition
    Wird keine Anzahl übergeben, werden ab Indexposition alle restlichen Elemente gelöscht

    _ObjAListReverse(Objekt, Von, Bis)
    Kehrt die Reihenfolge der Elemente im angegebenen Bereich um.

    _ObjAListSetRange(Objekt, EinfügeObjekt, Index)
    Kopiert die Elemente einer Auflistung (gleichartiges Objekt) über einen Bereich von Elementen in der ArrayList.

    =========================== OBJEKT 'System.Collections.Queue' =====================================

    _ObjQueueCreate()
    Erzeugt ein Queue-Objekt

    _ObjQueueAdd(Objekt, Wert)
    Fügt einem Queue-Objekt einen Wert hinzu

    _ObjQueueSearch(Objekt, Wert)
    Prüft auf Vorkommen des Wertes im Queue

    _ObjQueueGetFirst(Objekt)
    Gibt das erste Element aus dem Queue zurück, es verbleibt im Queue

    _ObjQueuePopFirst(Objekt)
    Gibt das erste Element aus dem Queue zurück, UND löscht es aus dem Queue

    _ObjQueueCount(Objekt)
    Gibt die Anzahl der Elemente des Queue zurück

    _ObjQueueToArray(Objekt)
    Gibt ein 1D-Array mit den Elementen des Queue zurück

    =========================== OBJEKT 'System.Collections.Stack' =====================================

    _ObjStackCreate()
    Erzeugt ein Stack-Objekt

    _ObjStackAdd(Objekt, Wert)
    Fügt einem Stack-Objekt einen Wert hinzu

    _ObjStackSearch(Objekt, Wert)
    Prüft auf Vorkommen des Wertes im Stack

    _ObjStackGetFirst(Objekt)
    Gibt das erste Element aus dem Stack zurück, es verbleibt im Stack

    _ObjStackPopLast(Objekt)
    Gibt das Letzte Element aus dem Stack zurück, UND löscht es aus dem Stack

    _ObjStackCount(Objekt)
    Gibt die Anzahl der Elemente des Stack zurück

    _ObjStackToArray(Objekt)
    Gibt ein 1D-Array mit den Elementen des Stack zurück

    ================================ SONSTIGE FUNKTIONEN ==============================================

    _ArrayToList()
    Konvertiert ein 1-Dimensionales Array in eine Liste, Queue oder Stack
    oder ein 2-Dimensionales Array in eine Hash-Tabelle

    _FileReadToList(Datei)
    Liest die angegebene Datei in ein Arraylist-Objekt

    _FileListToList(Pfad, Filter, Flag)
    Listet alle Dateien und Ordner eines Pfades (arbeitet wie Dir mit dem Schalter /B)

    ===================================================================================================

    Edit:
    Ich habe für das Objekt ArrayList eine weitere Funktion erstellt - _ObjAListAddColl()
    Damit lassen sich 1D-Arrays oder mit Delimiter getrennte Stringelemente der Arraylist hinzufügen.
    Die Funktion ist noch nicht in die .au3 eingefügt, deshalb hier der Quelltext:

    _ObjAListAddColl()
    [autoit]

    ;==================================================================================================
    ; Name: _ObjAListAddColl($ObjList, $Coll, $Delim='|')
    ; Parameter: $ObjList - Handle des Arraylist-Objektes
    ; $Coll - 1D-Array od. mit $Delim getrennter String (Standard '|')
    ; optional $Delim - Trennzeichen bei Stringübergabe
    ; Return: Erfolg: 0
    ; Fehler: -1
    ; Fehlerwert: 1 Objekt existiert nicht
    ; 2 Array ist kein 1D-Array
    ; 3 Aktion fehlgeschlagen
    ;==================================================================================================
    Func _ObjAListAddColl(ByRef $ObjList, $Coll, $Delim = '|')
    If (Not IsObj($ObjList)) Then Return SetError(1, 0, -1)
    If IsArray($Coll) Then
    If UBound($Coll, 0) > 1 Then Return SetError(2, 0, -1)
    For $i = 0 To UBound($Coll) -1
    $ObjList.Add($Coll[$i])
    If @error Then Return SetError(3, 0, -1)
    Next
    Else
    If Not StringInStr($Coll, $Delim) Then
    $ObjList.Add($Coll)
    If @error Then Return SetError(3, 0, -1)
    Else
    Local $aTmp = StringSplit($Coll, $Delim)
    For $i = 1 To UBound($aTmp) -1
    $ObjList.Add($aTmp[$i])
    If @error Then Return SetError(3, 0, -1)
    Next
    EndIf
    EndIf
    Return 0
    EndFunc ;==>_ObjAListAddColl

    [/autoit]
    • Offizieller Beitrag

    Hmm, interessanter Aspekt.
    Ich deklariere zwar aus alter Gewohnheit alle Variablen, setze aber nicht die Option. :whistling:
    Nur ist mir der Mechanismus von MustDeclareVars nicht richtig klar.
    Eigentlich hatte ich das unterschwellig im Hinterkopf als ich in den Funktionen alle Variablen deklarierte.
    Wenn MustDeclareVars gesetzt ist, sollte es doch schauen ob alle Variablen deklariert sind und meckern, wenn es nicht der Fall ist.
    Hierbei müßte es also stumm bleiben... :wacko:

  • Hallo, BugFix,

    wahnsinn was Du für AutoIt geleistet hast! :thumbup: Ich arbeite nicht so lange mit AutoIt, aber ich finde ihn schon jetzt absolut geil!
    Und als alter Perl-Freund habe ich mich heute tierisch gefreut, als ich meinen geliebten Hash hier vorgefunden habe ;)

    Ich vermisse aber eine Funktion, mit der man alle Schlüssel durchiterieren kann:

    z.B. _ObjHashGetKeys(Objekt)
    Gibt die Liste mit allen Schlüsseln zurück

    ... oder kann man es anders machen?

    Ich habe folgendes versucht:

    #include <UDF_ArrayAlternatives.au3>
    $myhash = _ObjHashCreate()
    $myhash.Add("a", 1)
    $myhash.Add("b", 2)
    $keys = ObjCreate("System.Collections.ArrayList")
    $keys = $myhash.Keys;

    ... geht nicht ! (aber dabei hat $keys.count den Wert 2 !)

    Mache ich was falsch?

    Danke noch mal für die tolle UDF-Sammlung, und auch an AspirinJunkie! :thumbup:

    Grüße,
    Alex

    Einmal editiert, zuletzt von abadonna (9. Februar 2009 um 14:15)

    • Offizieller Beitrag

    Tja, an der Stelle bin ich auch hängegeblieben, dadurch konnte ich keine derartige Funktion implementieren. Einziger Workaround derzeit: Die Keys parallel in einer Arraylist führen.

    Das Problem ist folgendes:
    .Keys liefert eine ICollection zurück. Das Objekt wird ordnungsgemäß erstellt und enthält laut .Count auch alle Elemente. Aber diese Collection reagiert scheinbar auf keine weitere Methode. Weder For $element In $oICol noch andere Versuche waren erfolgreich.
    Vielleicht findet ja jemand mit mehr Objekterfahrung eine Lösung.

  • Hab auch grad das Problem mit der Keys Methode bei HashTables. Hat da mitlerweile jemand ne Lösung zu parat?

  • Zitat von 'MSDN&quot;

    Die zurückgegebene ICollection ist keine statische Kopie, sondern die ICollection verweist zurück auf die Schlüssel in der ursprünglichen Hashtable.

    Das wird das Problem sein.
    Es sind keine Strings enthalten sondern Pointer.
    Ob die überhaupt in AutoIt verwendbar sind - keine Ahnung.

    Workaround: Nimm statt einer Hash-Table ein Dictionary das ist von der Bedienung her gleich und sollte auch flotter arbeiten, zumindestens wenn man nicht gerade tausende von Einträgen da drin führt.
    Erst dann sollte eine Hash-Table paar Vorteile ausspielen können.

    Spoiler anzeigen
    [autoit]

    ;////Dictionary Erstellen///////////
    $oDict = ObjCreate("Scripting.Dictionary")

    [/autoit] [autoit][/autoit] [autoit]

    ;////Einträge hinzufügen///////////
    $oDict.add ("Berlin", 3395189)
    $oDict.add ("Hamburg", 1743627)
    $oDict.add ("München", 1259677)
    $oDict.add ("Köln", 983347)
    $oDict.add ("Dresden", 512234)

    [/autoit] [autoit][/autoit] [autoit]

    For $i in $oDict.Keys
    ConsoleWrite($i & @CRLF)
    Next

    [/autoit]
  • Ahh danke, hab ich total übersehen, da ich eigentlich durch diesen Thread drauf gekommen bin, wo das "Dictionary" nicht erwähnt wird.
    Funktioniert auf jeden Fall einwandfrei. Danke. :)