Assoziatives Array - pur AutoIt , Aufatmen für "Arrayverweigerer" ;-)

    • Offizieller Beitrag

    Hi,
    vielleicht bietet diese UDF-Sammlung all jenen, die mit Arrays auf Kriegsfuß stehen, einen kleinen Lichtblick. :D
    Ich habe hier die Arrayfunktionen so gestaltet, dass der Zugriff ananlog zur objektbasierten ArrayList erfolgt. Da für das Objekt das nicht zwingend installierte NET-Framework erforderlich ist, ist diese reine AutoIt-Lösung sicher eine gute Ergänzung.
    Für einige Funktionen ist die Angabe der CaseSensitivity erforderlich. Da dieses Verhalten für mehrere Funktionen gilt, wird diese Eigenschaft für das gesamte Array deklariert.

    EDIT
    Eh ich's vergesse, der Vorteil für 'Array-Problematiker' ;) : Keinerlei Größenverwaltung notwendig, Index muß nicht verwendet werden.

    Funktionsübersicht


    _AssocArray_Create(CaseSensitive)
    Erstellt ein Assoziatives Array mit der definierten Eigenschaft.
    Mit -1 = Nicht Sensitive (Standard), mit 1 = Case Sensitive.
    Diese ist gültig für alle auf dieses Array angewendete Funktionen.
    Das Setzen der Eigenschaft in den HighWord-Bereich von Array[0] dient der Unterscheidung zu
    'normalen' Array. -1 statt 0 deshalb, da _WinAPI_HiWord() 0 zurückgibt, wenn kein DWORD-Wert
    abgefragt wird.
    Gibt das Handle des Array zurück.

    _AssocArray_Pref(Handle)
    Gibt die Eigenschaft des Assoziativen Array zurück.

    _AssocArray_Add(Handle, Wert)
    Fügt einen Wert zum Array hinzu.

    _AssocArray_AddColl(Handle, Kollektion, Trennzeichen, Ignore_0)
    Fügt eine Kollektion (1D-Array od. mit Trenner gesplitteter String) zum Array hinzu.
    Standardtrennzeichen (Zeichen von Opt("GUIDataSeparatorChar"))
    Ist das EinfügeArray 0-basiert, muß das Flag Ignore_0 auf 'False' gesetzt werden.

    _AssocArray_Insert(Handle, Index, Wert)
    Fügt einen Wert am gegebenen Index ein.

    _AssocArray_Count(Handle)
    Gibt die Anzahl der Elemente im Array zurück.

    _AssocArray_DelByName(Handle, Wert, All)
    Löscht den ersten gefundenen Eintrag, der mit Wert übereinstimmt.
    Mit Flag All auf 'True' werden alle dem Wert entsprechenden Einträge gelöscht.

    _AssocArray_DelByIndex(Handle, Index)
    Löscht den Eintrag am übergebenen Index.

    _AssocArray_Clear(Handle)
    Löscht alle Elemente aus dem Array.

    _AssocArray_Sort(Handle, Richtung)
    Sortiert alle Elemente des Array (Standard: aufsteigend).

    _AssocArray_ToString(Handle, Trennzeichen)
    Gibt einen String mit allen Elementen,
    getrennt durch Trennzeichen (Zeichen von Opt("GUIDataSeparatorChar")), zurück.

    _AssocArray_GetItem(Handle, Index)
    Gibt den Inhalt an der Indexposition zurück.

    _AssocArray_GetRange(Handle, Index, Anzahl)
    Gibt ab Indexposition eine Anzahl Elemente als Assoziatives Array zurück.
    Eigenschaft des abgefragten Array wird übernommen.

    _AssocArray_SetRange(Handle, EinfügeArray, Index, Ignore_0)
    Kopiert die Elemente eines (Assoziativen)Array über einen Bereich von Elementen im Array.
    Enthält das EinfügeArray mehr Elemente als ab Index überschrieben werden können,
    wird das Basisarray vergrößert.
    Ist das EinfügeArray 0-basiert, muß das Flag Ignore_0 auf 'False' gesetzt werden.

    _AssocArray_InsertRange(Handle, EinfügeArray, Index, Ignore_0)
    Fügt an der Indexposition ein (Assoziatives)Array ein.
    Für das eingefügte Array gilt die Eigenschaft des Zielarray.
    Ist das EinfügeArray 0-basiert, muß das Flag Ignore_0 auf 'False' gesetzt werden.

    _AssocArray_Search(Handle, Wert)
    Gibt TRUE zurück, wenn Wert im Array enthalten, sonst FALSE.

    _AssocArray_GetIndex(Handle, Wert)
    Gibt den Index des ersten gefundenen Eintrags zurück, der mit Wert übereinstimmt.

    _AssocArray_LastIndexOf(Handle, Wert, Von, Bis)
    Gibt den nullbasierten Index des letzten Vorkommens eines Werts im Array bzw. in einem Abschnitt davon zurück.

    _AssocArray_RemoveRange(Handle, Index, Anzahl)
    Löscht eine Anzahl Elemente ab Indexposition.
    Wird keine Anzahl übergeben, oder überschreitet die Anzahl die Arraygrenze,
    werden ab Indexposition alle restlichen Elemente gelöscht.

    _AssocArray_Reverse(Handle, Von, Bis)
    Kehrt die Reihenfolge der Elemente im angegebenen Bereich um.

    Beispiele
    [autoit]


    #include <AssocArray.au3>

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

    ; Array erstellen, Standardeigenschaft 'Nicht Case Sensitive'
    $array = _AssocArray_Create()

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

    ConsoleWrite('Eigenschaft: ' & _AssocArray_Pref($array) & @CRLF)

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

    ; Element hinzufügen
    _AssocArray_Add($array, 'AutoIt')

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

    ; Inhalt als String ausgeben, Trennzeichen von Opt("GUIDataSeparatorChar")
    ConsoleWrite('Inhalt als String: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Kollektion als String hinzufügen
    _AssocArray_AddColl($array, 'mama|papa|oma|opa|onkel|tante|mama')
    ConsoleWrite('AddColl String: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Kollektion als Array einfügen
    Local $ar[3] = [1,2,3]
    _AssocArray_AddColl($array, $ar, Default, False)
    ConsoleWrite('AddColl Array: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Vorkommen eines Wertes prüfen
    ConsoleWrite('Wert enthalten: ' & _AssocArray_Search($array, 'opa') & @CRLF)

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

    ; Wert einfügen an Indexposition
    _AssocArray_Insert($array, 5, 'mama')
    ConsoleWrite('Insert an Index 5: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Wert von Indexposition zurückgeben
    ConsoleWrite('Wert von Index 4: ' & _AssocArray_GetItem($array, 4) & @CRLF)

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

    ; Index für einen Wert zurückgeben
    ConsoleWrite('Index des Wertes, erstes Auftreten: ' & _AssocArray_GetIndex($array, 'mama') & @CRLF)

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

    ; Index für einen Wert, letztes Auftreten
    ConsoleWrite('Index des Wertes, letztes Auftreten: ' & _AssocArray_LastIndexOf($array, 'mama') & @CRLF)

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

    ; Bereich als Array zurückgeben
    $b = _AssocArray_GetRange($array, 2, 4)
    ConsoleWrite('Das Array: ' & _AssocArray_ToString($array) & @CRLF)
    ConsoleWrite('Der selektierte Bereich: ' & _AssocArray_ToString($b) & @CRLF)

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

    ; Bereich überschreiben
    Local $c[3] = ['X','Y','Z']
    _AssocArray_SetRange($array, $c, 6, False)
    ConsoleWrite('ab Index 6 überschrieben: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Array sortieren
    ; Kopie erstellen
    $copy_ar = $array
    _AssocArray_Sort($array)
    ConsoleWrite('sortiert aufsteigend: ' & _AssocArray_ToString($array) & @CRLF)
    _AssocArray_Sort($copy_ar, 1)
    ConsoleWrite('sortiert fallend: ' & _AssocArray_ToString($copy_ar) & @CRLF)

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

    ; Wert am Index löschen
    _AssocArray_DelByIndex($array, 3)
    ConsoleWrite('an Index 3 gelöscht: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Wert nach Namen löschen, erstes Auftreten
    _AssocArray_DelByName($array, 'mama')
    ConsoleWrite('erstes Auftreten "mama" gelöscht: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Wert nach Namen löschen, jedes Auftreten
    _AssocArray_DelByName($array, 'mama', True)
    ConsoleWrite('jedes Auftreten "mama" gelöscht: ' & _AssocArray_ToString($array) & @CRLF)

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

    ; Reihenfolge im Array umkehren
    _AssocArray_Reverse($array)
    ConsoleWrite('umgedreht: ' & _AssocArray_ToString($array) & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    Hier mal noch ( als kleiner Service :D ), die UserCallTipps für die Funktionen.
    Im Ordner '..\SciTE\api\' die Datei 'au3.user.calltips.api' öffnen, oder wenn nicht vorhanden - erstellen, und die folgenden Zeilen anfügen:

    Calltips
  • nice :) Das hat bei AutoIt bisher immer gefehlt, fand ich bei PHP immer schon eine sehr schöne sache mit den assoziativen arrays, vor allem im Umgang mit SQL abfragen :)

    Das ganze funktioniert aber nicht (wie in PHP) zweidimensional oder? (bzw. nur mit umwegen?)
    $array[1]['beispiel']

    Bisher hatte ich das in autoit einfach so gelöst (ich weiss ist kein richtiges assoc array aber passt schon ^^)

    Global Const $BEISPIEL = 2
    $array[$BEISPIEL]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Ich frag mich nur, was da jetzt assoziativ ist :) Die Schlüssel sind ja immer noch Zahlen. Es geht doch kein

    Code
    "EintragABC" -> "WertXYZ"
    "EintragGHI" -> "Wert123"


    oder ?

    • Offizieller Beitrag

    Was du ansprichst ist ein 2D-Array zum Speichern von Schlüssel-Wert-Paaren (oder als Objekt: Scripting.Dictionary).
    Die Erweiterung kommt als nächstes.
    Assoziativ ist es natürlich nur bedingt, da du nicht adressieren mußt sondern den Wert als solchen zufügst, mit dem Wert auf dessen Existenz prüfst.
    Mein Anliegen war hauptsächlich, ein "Objekt" ohne Netframework zu erstellen, dass aber die gesamte Funktionalität einer ArrayList aufweist. Und das ist gelungen. ;)

  • Ahh, das meinst du. Fur mich ist eine assoziattives Array immer das gewesen, was auch in Wikipedia beschrieben wird

    Zitat

    Das „Assoziative Array“ ist eine Datenstruktur, die – anders als ein echtes Array – nichtnumerische Schlüssel (zumeist Zeichenketten) verwendet, um die enthaltenen Elemente zu adressieren; diese liegen in keiner festgelegten Reihenfolge vor.

    • Offizieller Beitrag

    Ja, so RICHTIG assoziativ wird das nicht gelingen. Da ich in einem Array speichere, kann ich dessen Struktur nicht aus den Angeln heben. Eigentlich sind es nur die Funktionen, die dem User vorgaukeln, dass keine Index- oder Größenverwaltung stattfindet. Aber im Kern bleibt es ein stinknormales Indexbasiertes Array.