Objekt: SortedList

    • Offizieller Beitrag

    Ich habe mal ein weiteres Objekt nach AutoIt portiert - das Objekt 'System.Collections.SortedList'.
    In diesem Objekt werden Schlüssel-Wert-Paare automatisch (nach Schlüssel) sortiert. Schlüssel sind eineindeutig und können somit nur einmal vorkommen. Die Unterscheidung ist sensitiv ('auto' <> 'Auto').
    Die Funktionen erlauben einen Zugriff mittels Schlüssel oder Index. Ich würde empfehlen die Schlüssel-basierten Funktionen vorrangig zu nutzen, denn jede Änderung an der Liste ändert auch automatisch die Indexwerte.
    Die Löschfunktionen erlauben optional, nicht genutzten Speicher freizugeben. So, wie wir ReDim zur dynamischen Arrayanpassung nutzen, wird zur Laufzeit die SortedList automatisch vergrößert (mehr Speicherplatz reserviert) wenn neu hinzukommende Elemente diesen benötigen. Wenn ich also Werte lösche aber auch wieder neue hinzufüge, macht es keinen Sinn den Speicherplatz auf die tatsächliche Listengröße zu trimmen. Deshalb ist diese Option standardmäßig auf 'False' gesetzt.
    Ich habe neben der Umsetzung der überwiegenden Anzahl der existierenden Methoden zusätzlich Funktionen erstellt zum Schreiben/Lesen in/aus INI/Datei.

    Funktionsübersicht

    _ObjSortedList_Create
    Erstellt eine leere SortedList.

    _ObjSortedList_ReadFromIni
    Liest die Schlüssel-Wert-Paare aus einer INI-Sektion, erstellt eine SortedList und befüllt sie damit.
    Optional kann eine leere SortedList zum Befüllen übergeben werden.

    _ObjSortedList_WriteToIni
    Schreibt die Schlüssel-Wert-Paare einer SortedList in eine INI-Sektion.

    _ObjSortedList_ReadFromFile
    Liest die Schlüssel-Wert-Paare aus einer Text-Datei der Zeilenstruktur: SCHLÜSSEL DELIMITER WERT @CRLF
    in eine zu erstellende/bereits existierende leere SortedList.

    _ObjSortedList_WriteToFile
    Schreibt die Schlüssel-Wert-Paare einer SortedList in eine Text-Datei (Zeilenstruktur s.o.).
    Die Werte können wahlweise überschrieben oder angehängt werden.

    _ObjSortedList_AddPair
    Fügt einer SortedList ein Schlüssel-Wert-Paar hinzu.

    _ObjSortedList_AddArray
    Fügt ein Array (oder Teile davon) einer SortedList hinzu. (Array[n][0]=Key, Array[n][1]=Value)

    _ObjSortedList_Count
    Gibt die Anzahl Schlüssel-Wert-Paare einer SortedList zurück.

    _ObjSortedList_Clear
    Löscht alle Schlüssel-Wert-Paare einer SortedList. Optional kann der Speicher freigegeben werden.

    _ObjSortedList_RemoveByKey
    Löscht ein Schlüssel-Wert-Paare einer SortedList nach Schlüssel. Optional kann der Speicher freigegeben werden.

    _ObjSortedList_RemoveByIndex
    Löscht ein Schlüssel-Wert-Paare einer SortedList nach Index. Optional kann der Speicher freigegeben werden.

    _ObjSortedList_Clone
    Erzeugt eine Kopie der SortedList.

    _ObjSortedList_ContainsKey
    Prüft ob die SortedList einen bestimmten Schlüssel enthält.

    _ObjSortedList_ContainsVal
    Prüft ob die SortedList einen bestimmten Wert enthält.

    _ObjSortedList_SetValByKey
    Ändert den Wert eines Schlüssels mit dem Schlüsselnamen.

    _ObjSortedList_SetValByIndex
    Ändert den Wert eines Schlüssels mit dem Index.

    _ObjSortedList_RenameKeyByName
    Ändert den Namen eines Schlüssels mit dem Schlüsselnamen.

    _ObjSortedList_RenameKeyByIndex
    Ändert den Namen eines Schlüssels mit dem Index.

    _ObjSortedList_AsArray
    Gibt die SortedList als 2D-Array zurück.

    _ObjSortedList_GetIndexOfKey
    Gibt den Index eines Schlüssels zurück.

    _ObjSortedList_GetKeyByIndex
    Gibt den Schlüsselnamen für einen Index zurück.

    _ObjSortedList_GetKeyByVal
    Gibt ein 2D-Array mit allen Vorkommen eines Wertes zurück.
    Array[0][0]=Anzahl Vorkommen, Array[n][0]=Index, Array[n][1]=Schlüssel.

    _ObjSortedList_GetValByIndex
    Gibt den Wert für einen Index zurück.

    _ObjSortedList_GetValByKey
    Gibt den Wert für einen Schlüsselnamen zurück.

    Code Funktionen
    [autoit]

    ;===============================================================================
    ; Function Name: _ObjSortedList_Create()
    ; Description: Erstellt eine leere SortedList.
    ; Return Value(s):
    ; Erfolg: Ein leeres SortedList-Objekt
    ; Fehler: -1 @error Objekt konnte nicht erstellt werden
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_Create()
    Local $oSL = ObjCreate('System.Collections.SortedList')
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    Return $oSL
    EndFunc ;==>_ObjSortedList_Create

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_ReadFromIni($sPATH_INI, $sSECTION, $oSL = 0)
    ; Description: Liest die Schlüssel-Wert-Paare aus einer INI-Sektion, erstellt eine SortedList und befüllt sie damit.
    ; Optional kann eine leere SortedList zum Befüllen übergeben werden.
    ; Parameter(s): $sPATH_INI Pfad zur INI
    ; $sSECTION Sektionsname
    ; $oSL 0 (Standard) erstellt eine neue Liste, sonst wird in die übergebene (leere) Liste eingetragen.
    ; Return Value(s):
    ; Erfolg: Ein mit den INI-Werten befülltes SortedList-Objekt
    ; Fehler: -1 @error 1 INI existiert nicht
    ; 2 Fehler beim Erstellen der Liste
    ; 3 Sektion existiert nicht
    ; $oSL @error 4 doppelte Schlüssel in INI, nur erstmaliges Auftreten verwendet
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_ReadFromIni($sPATH_INI, $sSECTION, $oSL = 0)
    If Not FileExists($sPATH_INI) Then Return SetError(1, 0, -1)
    If $oSL = 0 Then
    $oSL = _ObjSortedList_Create()
    If @error Then Return SetError(2, 0, -1)
    EndIf
    Local $aINI = IniReadSection($sPATH_INI, $sSECTION)
    If @error Then Return SetError(3, 0, -1)
    Local $ret = _ObjSortedList_AddArray($oSL, $aINI, 1)
    If @error Then Return SetError(4, 0, $oSL)
    Return $oSL
    EndFunc ;==>_ObjSortedList_ReadFromIni

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_WriteToIni($oSL, $sPATH_INI, $sSECTION)
    ; Description: Schreibt die Schlüssel-Wert-Paare einer SortedList in eine INI-Sektion.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $sPATH_INI Pfad zur INI
    ; $sSECTION Sektionsname
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 Fehler beim Lesen der Liste
    ; 2 Fehler beim Schreiben in die INI
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_WriteToIni(ByRef $oSL, $sPATH_INI, $sSECTION)
    Local $aToWrite = _ObjSortedList_AsArray($oSL)
    If @error Then Return SetError(1, 0, -1)
    IniWriteSection($sPATH_INI, $sSECTION, $aToWrite)
    If @error Then Return SetError(2, 0, -1)
    Return 1
    EndFunc ;==>_ObjSortedList_WriteToIni

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_ReadFromFile($sPATH_FILE, $sDELIM = Default, $oSL = 0)
    ; Description: Liest die Schlüssel-Wert-Paare aus einer Text-Datei der Zeilenstruktur: SCHLÜSSEL DELIMITER WERT @CRLF
    ; in eine zu erstellende/bereits existierende leere SortedList.
    ; Parameter(s): $sPATH_FILE Pfad zur Datei
    ; $sDELIM Trennzeichen zw. Schlüssel u. Wert ('Default' verwendet Opt('GUIDataSeparatorChar') )
    ; $oSL 0 (Standard) erstellt eine neue Liste, sonst wird in die übergebene (leere) Liste eingetragen.
    ; Return Value(s):
    ; Erfolg: Ein mit den Datei-Werten befülltes SortedList-Objekt
    ; Fehler: -1 @error 1 Dateipfad existiert nicht
    ; 2 Fehler beim Erstellen der Liste
    ; 3 Datei enthält keine Schlüssel-Wert-Paare
    ; $oSL @error 4 doppelte Schlüssel in Datei, nur erstmaliges Auftreten verwendet
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_ReadFromFile($sPATH_FILE, $sDELIM = Default, $oSL = 0)
    If Not FileExists($sPATH_FILE) Then Return SetError(1, 0, -1)
    If IsKeyword($sDELIM) Then $sDELIM = Opt('GUIDataSeparatorChar')
    If $oSL = 0 Then
    $oSL = _ObjSortedList_Create()
    If @error Then Return SetError(2, 0, -1)
    EndIf
    Local $sRead = FileRead($sPATH_FILE)
    Local $aSplit = StringSplit($sRead, @CRLF, 1)
    If $aSplit[0] = 1 Or ($aSplit[0] > 1 And $aSplit[1] = '') Then Return SetError(3, 0, -1)
    Local $aToList[$aSplit[0]][2], $aLineSplit, $iLoop = 0
    For $i = 1 To $aSplit[0]
    $aLineSplit = StringSplit($aSplit[$i], $sDELIM, 3)
    If @error Then
    $iLoop += 1
    ContinueLoop
    EndIf
    $aToList[$i - 1][0] = $aLineSplit[0]
    $aToList[$i - 1][1] = $aLineSplit[1]
    Next
    If $iLoop Then ReDim $aToList[$aSplit[0] - $iLoop][2]
    Local $ret = _ObjSortedList_AddArray($oSL, $aToList)
    If @error Then Return SetError(4, 0, $oSL) ; doppelte Schlüssel in INI vorhanden (ignoriert)
    Return $oSL
    EndFunc ;==>_ObjSortedList_ReadFromFile

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_WriteToFile($oSL, $sPATH_FILE, $sDELIM = Default, $fOVERWRITE = True)
    ; Description: Schreibt die Schlüssel-Wert-Paare in eine Text-Datei (Zeilenstruktur s. '_ReadFromFile').
    ; Die Werte können wahlweise überschrieben oder angehängt werden.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $sDELIM Trennzeichen zw. Schlüssel u. Wert ('Default' verwendet Opt('GUIDataSeparatorChar') )
    ; $fOVERWRITE 'True' (Standard) überschreibt, 'False' hängt an
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 Fehler beim Lesen der SortedList
    ; 2 Fehler beim Öffnen der Datei
    ; 3 Fehler beim Schreiben in die Datei
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_WriteToFile(ByRef $oSL, $sPATH_FILE, $sDELIM = Default, $fOVERWRITE = True)
    If IsKeyword($sDELIM) Then $sDELIM = Opt('GUIDataSeparatorChar')
    If $fOVERWRITE Then
    $fOVERWRITE = 8 + 2
    Else
    $fOVERWRITE = 8 + 1
    EndIf
    Local $sToWrite = '', $aToWrite = _ObjSortedList_AsArray($oSL)
    If @error Then Return SetError(1, 0, -1)
    For $i = 1 To $aToWrite[0][0]
    $sToWrite &= $aToWrite[$i][0] & $sDELIM & $aToWrite[$i][1] & @CRLF
    Next
    Local $fh = FileOpen($sPATH_FILE, $fOVERWRITE)
    If @error Then Return SetError(2, 0, -1)
    FileWrite($fh, $sToWrite)
    If @error Then Return SetError(3, 0, -1)
    Return FileClose($fh)
    EndFunc ;==>_ObjSortedList_WriteToFile

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_AddPair($oSL, $KEY, $VALUE)
    ; Description: Fügt einer SortedList ein Schlüssel-Wert-Paar hinzu.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel
    ; $VALUE Wert
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel bereits in Liste enthalten
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_AddPair(ByRef $oSL, $KEY, $VALUE)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    $oSL.Add($KEY, $VALUE)
    Return 1
    EndFunc ;==>_ObjSortedList_AddPair

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_AddArray($oSL, $ARRAY, $iStart = 0, $iUb = 0)
    ; Description: Fügt ein Array (oder Teile davon) einer SortedList hinzu.
    ; (Array[n][0]=Key, Array[n][1]=Value)
    ; Parameter(s): $oSL SortedList-Objekt
    ; $ARRAY 2D-Array mit Schlüssel-Wert-Paaren
    ; $iStart Index im Array mit erstem zu übernehmenden Paar (Standard 0)
    ; $iUb Index des letzten zu übernehmenden Paares (Standard 0 = bis Ende)
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 fehlerhaftes Array übergeben (falsche Dimension)
    ; String m. FehlIndex, @error 3 doppelte Schlüssel in Array, nur erstmaliges Auftreten verwendet
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_AddArray(ByRef $oSL, ByRef $ARRAY, $iStart = 0, $iUb = 0)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If UBound($ARRAY, 0) <> 2 Or UBound($ARRAY) < 1 Then Return SetError(2, 0, -1)
    If ($iUb <= 0) Or ($iUb > UBound($ARRAY) - 1) Then $iUb = UBound($ARRAY) - 1
    If $iUb < $iStart Then $iUb = $iStart
    Local $sFailIndex = ''
    For $i = $iStart To $iUb
    If $oSL.ContainsKey($ARRAY[$i][0]) Then
    $sFailIndex &= $i & ','
    ContinueLoop
    EndIf
    $oSL.Add($ARRAY[$i][0], $ARRAY[$i][1])
    Next
    If StringLen($sFailIndex) Then Return SetError(3, 0, StringTrimRight($sFailIndex, 1))
    Return 1
    EndFunc ;==>_ObjSortedList_AddArray

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_Count($oSL)
    ; Description: Gibt die Anzahl Schlüssel-Wert-Paare einer SortedList zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; Return Value(s):
    ; Erfolg: Anzahl Schlüssel-Wert-Paare
    ; Fehler: -1 @error $oSL ist kein Objekt
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_Count(ByRef $oSL)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    Return $oSL.Count
    EndFunc ;==>_ObjSortedList_Count

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_Clear($oSL, $fTRIM = False)
    ; Description: Löscht alle Schlüssel-Wert-Paare einer SortedList.
    ; Optional kann der Speicher freigegeben werden.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $fTRIM 'True' gibt den nicht mehr genutzten Speicher frei, (Standard 'False')
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error $oSL ist kein Objekt
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_Clear(ByRef $oSL, $fTRIM = False)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    $oSL.Clear
    If $fTRIM Then $oSL.TrimToSize
    Return 1
    EndFunc ;==>_ObjSortedList_Clear

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_RemoveByKey($oSL, $KEY, $fTRIM = False)
    ; Description: Löscht ein Schlüssel-Wert-Paar einer SortedList nach Schlüssel.
    ; Optional kann der Speicher freigegeben werden.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel des Paares das gelöscht werden soll
    ; $fTRIM 'True' gibt den nicht mehr genutzten Speicher frei, (Standard 'False')
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel ist nicht in Liste enthalten
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_RemoveByKey(ByRef $oSL, $KEY, $fTRIM = False)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    $oSL.Remove($KEY)
    If $fTRIM Then $oSL.TrimToSize
    Return 1
    EndFunc ;==>_ObjSortedList_RemoveByKey

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_RemoveByIndex($oSL, $INDEX, $fTRIM = False)
    ; Description: Löscht ein Schlüssel-Wert-Paar einer SortedList nach Index.
    ; Optional kann der Speicher freigegeben werden.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $INDEX Index des Paares das gelöscht werden soll
    ; $fTRIM 'True' gibt den nicht mehr genutzten Speicher frei, (Standard 'False')
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Index ist nicht in Liste enthalten
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_RemoveByIndex(ByRef $oSL, $INDEX, $fTRIM = False)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $INDEX < 0 Or $INDEX > $oSL.Count - 1 Then Return SetError(2, 0, -1)
    $oSL.RemoveAt($INDEX)
    If $fTRIM Then $oSL.TrimToSize
    Return 1
    EndFunc ;==>_ObjSortedList_RemoveByIndex

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_Clone($oSL)
    ; Description: Erzeugt eine Kopie der SortedList.
    ; Parameter(s): $oSL SortedList-Objekt
    ; Return Value(s):
    ; Erfolg: Kopie der Liste
    ; Fehler: -1 @error $oSL ist kein Objekt
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_Clone(ByRef $oSL)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    Return $oSL.Clone
    EndFunc ;==>_ObjSortedList_Clone

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_ContainsKey($oSL, $KEY)
    ; Description: Prüft ob die SortedList einen bestimmten Schlüssel enthält.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel
    ; Return Value(s):
    ; Erfolg: True / False vorhanden / nicht vorhanden
    ; Fehler: -1 @error $oSL ist kein Objekt
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_ContainsKey(ByRef $oSL, $KEY)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    Return $oSL.ContainsKey($KEY)
    EndFunc ;==>_ObjSortedList_ContainsKey

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_ContainsVal($oSL, $VALUE)
    ; Description: Prüft ob die SortedList einen bestimmten Wert enthält.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $VALUE Wert
    ; Return Value(s):
    ; Erfolg: True / False vorhanden / nicht vorhanden
    ; Fehler: -1 @error $oSL ist kein Objekt
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_ContainsVal(ByRef $oSL, $VALUE)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    Return $oSL.ContainsValue($VALUE)
    EndFunc ;==>_ObjSortedList_ContainsVal

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_SetValByKey($oSL, $KEY, $NEW_VALUE)
    ; Description: Ändert den Wert eines Schlüssels mit dem Schlüsselnamen.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel
    ; $NEW_VALUE neuer Wert
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_SetValByKey(ByRef $oSL, $KEY, $NEW_VALUE)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    $oSL.SetByIndex($oSL.IndexOfKey($KEY), $NEW_VALUE)
    Return 1
    EndFunc ;==>_ObjSortedList_SetValByKey

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_SetValByIndex($oSL, $INDEX, $NEW_VALUE)
    ; Description: Ändert den Wert eines Schlüssels mit dem Index.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $INDEX Index
    ; $NEW_VALUE neuer Wert
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Index ist nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_SetValByIndex(ByRef $oSL, $INDEX, $NEW_VALUE)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $INDEX < 0 Or $INDEX > $oSL.Count - 1 Then Return SetError(2, 0, -1)
    $oSL.SetByIndex($INDEX, $NEW_VALUE)
    Return 1
    EndFunc ;==>_ObjSortedList_SetValByIndex

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_RenameKeyByName($oSL, $KEY, $NEW_KEYNAME)
    ; Description: Ändert den Namen eines Schlüssels mit dem Schlüsselnamen.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel (alter Name)
    ; $NEW_KEYNAME Schlüssel (neuer Name)
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel nicht in Liste
    ; 3 neuer Schlüsselname bereits vorhanden
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_RenameKeyByName(ByRef $oSL, $KEY, $NEW_KEYNAME)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    If $oSL.ContainsKey($NEW_KEYNAME) Then Return SetError(3, 0, -1)
    Local $val = $oSL.GetByIndex($oSL.IndexOfKey($KEY))
    $oSL.RemoveAt($oSL.IndexOfKey($KEY))
    $oSL.Add($NEW_KEYNAME, $val)
    Return 1
    EndFunc ;==>_ObjSortedList_RenameKeyByName

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_RenameKeyByIndex($oSL, $INDEX, $NEW_KEYNAME)
    ; Description: Ändert den Namen eines Schlüssels mit dem Index.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $INDEX Index
    ; $NEW_KEYNAME Schlüssel (neuer Name)
    ; Return Value(s):
    ; Erfolg: 1
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Index ist nicht in Liste
    ; 3 neuer Schlüsselname bereits vorhanden
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_RenameKeyByIndex(ByRef $oSL, $INDEX, $NEW_KEYNAME)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $INDEX < 0 Or $INDEX > $oSL.Count - 1 Then Return SetError(2, 0, -1)
    If $oSL.ContainsKey($NEW_KEYNAME) Then Return SetError(3, 0, -1)
    Local $val = $oSL.GetByIndex($INDEX)
    $oSL.RemoveAt($INDEX)
    $oSL.Add($NEW_KEYNAME, $val)
    Return 1
    EndFunc ;==>_ObjSortedList_RenameKeyByIndex

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_AsArray(ByRef $oSL, $TYPE = 0)
    ; Description: Gibt die SortedList als 2D-Array zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $TYPE 0 (Standard) 2D-Array m.: Array[0][0]=Anzahl, Array[n][0]=Key, Array[n][1]=Value
    ; 1 1D-Array nur Schlüssel
    ; 2 1D-Array nur Werte
    ; Return Value(s):
    ; Erfolg: Array mit Schlüsseln und/oder Werten
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Liste ist leer
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_AsArray(ByRef $oSL, $TYPE = 0)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $oSL.Count = 0 Then Return SetError(2, 0, -1)
    If $TYPE < 0 Then $TYPE = 0
    If $TYPE > 2 Then $TYPE = 2
    Local $aOut[$oSL.Count + 1]
    $aOut[0] = $oSL.Count
    Switch $TYPE
    Case 0
    ReDim $aOut[$oSL.Count + 1][2]
    $aOut[0][0] = $oSL.Count
    For $i = 0 To $aOut[0][0] - 1
    $aOut[$i + 1][0] = $oSL.GetKey($i)
    $aOut[$i + 1][1] = $oSL.GetByIndex($i)
    Next
    Case 1, 2
    For $i = 0 To $aOut[0] - 1
    If $TYPE = 1 Then
    $aOut[$i + 1] = $oSL.GetKey($i)
    Else
    $aOut[$i + 1] = $oSL.GetByIndex($i)
    EndIf
    Next
    EndSwitch
    Return $aOut
    EndFunc ;==>_ObjSortedList_AsArray

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_GetIndexOfKey($oSL, $KEY)
    ; Description: Gibt den Index eines Schlüssels zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel
    ; Return Value(s):
    ; Erfolg: Index des Schlüssels
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_GetIndexOfKey(ByRef $oSL, $KEY)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    Return $oSL.IndexOfKey($KEY)
    EndFunc ;==>_ObjSortedList_GetIndexOfKey

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_GetKeyByIndex($oSL, $INDEX)
    ; Description: Gibt den Schlüsselnamen für einen Index zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $INDEX Index
    ; Return Value(s):
    ; Erfolg: Schlüssel an Indexposition
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Index nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_GetKeyByIndex(ByRef $oSL, $INDEX)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $INDEX < 0 Or $INDEX > $oSL.Count - 1 Then Return SetError(2, 0, -1)
    Return $oSL.GetKey($INDEX)
    EndFunc ;==>_ObjSortedList_GetKeyByIndex

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_GetKeyByVal($oSL, $VALUE)
    ; Description: Gibt ein 2D-Array mit allen Vorkommen eines Wertes zurück.
    ; Array[0][0]=Anzahl Vorkommen, Array[0][0]=VALUE, Array[n][0]=Index, Array[n][1]=Schlüssel.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $VALUE Wert dessen Vorkommen ermittelt wird
    ; Return Value(s):
    ; Erfolg: Array mit Schlüssel(n) und Index(es) des gefragten wertes
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Wert nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_GetKeyByVal(ByRef $oSL, $VALUE)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsValue($VALUE) Then Return SetError(2, 0, -1)
    Local $aOut[1][2] = [[0, $VALUE]]
    For $i = 0 To $oSL.Count - 1
    If $oSL.GetByIndex($i) == $VALUE Then
    ReDim $aOut[UBound($aOut) + 1][2]
    $aOut[0][0] += 1 ; Anzahl
    $aOut[UBound($aOut) - 1][0] = $i ; Index in Sorted-List
    $aOut[UBound($aOut) - 1][1] = $oSL.GetKey($i) ; Schlüssel
    EndIf
    Next
    Return $aOut
    EndFunc ;==>_ObjSortedList_GetKeyByVal

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_GetValByIndex($oSL, $INDEX)
    ; Description: Gibt den Wert für einen Index zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $INDEX Index
    ; Return Value(s):
    ; Erfolg: Wert an Indexposition
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Index nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_GetValByIndex(ByRef $oSL, $INDEX)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If $INDEX < 0 Or $INDEX > $oSL.Count - 1 Then Return SetError(2, 0, -1)
    Return $oSL.GetByIndex($INDEX)
    EndFunc ;==>_ObjSortedList_GetValByIndex

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

    ;===============================================================================
    ; Function Name: _ObjSortedList_GetValByKey($oSL, $KEY)
    ; Description: Gibt den Wert für einen Schlüssel zurück.
    ; Parameter(s): $oSL SortedList-Objekt
    ; $KEY Schlüssel
    ; Return Value(s):
    ; Erfolg: Wert des Schlüssels
    ; Fehler: -1 @error 1 $oSL ist kein Objekt
    ; 2 Schlüssel nicht in Liste
    ; Author(s): BugFix
    ;===============================================================================
    Func _ObjSortedList_GetValByKey(ByRef $oSL, $KEY)
    If Not IsObj($oSL) Then Return SetError(1, 0, -1)
    If Not $oSL.ContainsKey($KEY) Then Return SetError(2, 0, -1)
    Return $oSL.GetByIndex($oSL.IndexOfKey($KEY))
    EndFunc ;==>_ObjSortedList_GetValByKey

    [/autoit]
    Bsp. Skript
    [autoit]


    #include-once
    #include <Array.au3>
    #include 'objSortedList.au3'

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

    ;== Sortierte Liste erstellen
    $oSL = _ObjSortedList_Create()

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

    ;== Schlüssel-Wertpaare hinzufügen
    _ObjSortedList_AddPair($oSL, 'Tomate', 5)
    _ObjSortedList_AddPair($oSL, 'Birne', 2)
    _ObjSortedList_AddPair($oSL, 'Apfel', 3)
    _ObjSortedList_AddPair($oSL, 'Zwetschke', 20)
    _ObjSortedList_AddPair($oSL, 'Erdbeere', 10)

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

    ;== Anzahl Schlüssel-Wertpaare ausgeben
    ConsoleWrite('Anzahl Paare: ' & _ObjSortedList_Count($oSL) & @CRLF & @CRLF)

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

    ;== alle Schlüssel-Wertpaare als Array(2D) ausgeben
    $aList = _ObjSortedList_AsArray($oSL)
    _ArrayDisplay($aList, 'Schlüssel-Wert Paare')

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

    ;== alle Schlüssel als Array(1D) ausgeben
    $aList = _ObjSortedList_AsArray($oSL, 1)
    _ArrayDisplay($aList, 'Schlüssel')

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

    ;== alle Werte als Array(1D) ausgeben
    $aList = _ObjSortedList_AsArray($oSL, 2)
    _ArrayDisplay($aList, 'Werte')

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

    ;== Wert für SchlüsselName ausgeben
    ConsoleWrite('_GetValByKey(Apfel): ' & _ObjSortedList_GetValByKey($oSL, 'Apfel') & @CRLF & @CRLF)

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

    ;== Wert für Index ausgeben
    ConsoleWrite('_GetValByIndex(4): ' & _ObjSortedList_GetValByIndex($oSL, 4) & @CRLF & @CRLF)

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

    ;== SchlüsselName für Index ausgeben
    ConsoleWrite('Schlüsselname an Index(3): ' & _ObjSortedList_GetKeyByIndex($oSL, 3) & @CRLF & @CRLF)

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

    ;== Liste auf Schlüssel prüfen
    ConsoleWrite('Schlüssel "Birne" enthalten? ' & _ObjSortedList_ContainsKey($oSL, 'Birne') & @CRLF)
    ConsoleWrite('Schlüssel "Kohlrabi" enthalten? ' & _ObjSortedList_ContainsKey($oSL, 'Kohlrabi') & @CRLF & @CRLF)

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

    ;== Liste auf Werte prüfen
    ConsoleWrite('Wert "10" enthalten? ' & _ObjSortedList_ContainsVal($oSL, 10) & @CRLF)
    ConsoleWrite('Wert "17" enthalten? ' & _ObjSortedList_ContainsVal($oSL, 17) & @CRLF & @CRLF)

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

    ;== Wert über SchlüsselNamen ändern
    _ObjSortedList_SetValByKey($oSL, 'Apfel', 6)
    ConsoleWrite('neuer Wert "Apfel": ' & _ObjSortedList_GetValByKey($oSL, 'Apfel') & @CRLF & @CRLF)

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

    ;==Wert über Index ändern
    _ObjSortedList_SetValByIndex($oSL, 1, 18)
    ConsoleWrite('neuer Wert (1): ' & _ObjSortedList_GetValByIndex($oSL, 1) & @CRLF & @CRLF)

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

    ;== SchlüsselIndex abfragen
    ConsoleWrite('Index(Erdbeere): ' & _ObjSortedList_GetIndexOfKey($oSL, 'Erdbeere') & @CRLF & @CRLF)

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

    ;== SchlüsselName ändern über Name
    ConsoleWrite('vor Änderung(by Name): existiert "Erdbeere"? ' & _ObjSortedList_ContainsKey($oSL, 'Erdbeere') & @CRLF)
    _ObjSortedList_RenameKeyByName($oSL, 'Erdbeere', 'Himbeere')
    ConsoleWrite('nach Änderung: existiert "Erdbeere"? ' & _ObjSortedList_ContainsKey($oSL, 'Erdbeere') & @CRLF)
    ConsoleWrite('nach Änderung: existiert "Himbeere"? ' & _ObjSortedList_ContainsKey($oSL, 'Himbeere') & @CRLF & @CRLF)

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

    ;== SchlüsselName ändern über Index
    $oldKey = _ObjSortedList_GetKeyByIndex($oSL, 3)
    ConsoleWrite('vor Änderung(by Index): Schlüssel an Index(3)? ' & $oldKey & @CRLF)
    _ObjSortedList_RenameKeyByIndex($oSL, 3, 'Banane')
    ConsoleWrite('nach Änderung: existiert "' & $oldKey & '"? ' & _ObjSortedList_ContainsKey($oSL, $oldKey) & @CRLF)
    ConsoleWrite('nach Änderung: existiert "Banane"? ' & _ObjSortedList_ContainsKey($oSL, 'Banane') & @CRLF & @CRLF)

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

    ;== Eintrag nach Schlüsselnamen löschen und Speicher freigeben
    ConsoleWrite('vor Löschen(by Name): existiert "Apfel"? ' & _ObjSortedList_ContainsKey($oSL, 'Apfel') & @CRLF)
    _ObjSortedList_RemoveByKey($oSL, 'Apfel', True)
    ConsoleWrite('nach Löschen: existiert "Apfel"? ' & _ObjSortedList_ContainsKey($oSL, 'Apfel') & @CRLF & @CRLF)

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

    ;== Eintrag nach Index löschen und Speicher nicht freigeben
    $oldKey = _ObjSortedList_GetKeyByIndex($oSL, 0)
    ConsoleWrite('vor Löschen(by Index): Schlüssel an Index(0)? ' & $oldKey & @CRLF)
    _ObjSortedList_RemoveByIndex($oSL, 0)
    ConsoleWrite('nach Löschen: existiert "' & $oldKey & '"? ' & _ObjSortedList_ContainsKey($oSL, $oldKey) & @CRLF & @CRLF)

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

    ;== Klon der Liste erstellen und als Array ausgeben
    $oClone = _ObjSortedList_Clone($oSL)
    $aList = _ObjSortedList_AsArray($oClone)
    _ArrayDisplay($aList, 'Schlüssel-Wert Paare')

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

    ;== Inhalt Ursprungsliste leeren (Liste bleibt als Objekt erhalten)
    _ObjSortedList_Clear($oSL)
    ConsoleWrite('Anzahl nach Löschen Liste: ' & _ObjSortedList_Count($oSL) & @CRLF & @CRLF)

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

    ;== Array mit Schlüssel-Wertpaaren erstellen
    ;== Schlüssel müssen EINMALIG sein, doppelte(mehrfache) Schlüssel werden ignoriert
    ;== Indexwerte mehrfacher Schlüssel werden zurückgegeben
    Local $a[7][2] = [['Tomate',5],['Birne',2],['Tomate',5],['Apfel',3],['Zwetschke',20],['Erdbeere',20],['Apfel',5]]
    Local $ret = _ObjSortedList_AddArray($oSL, $a)
    If @error = 3 Then ConsoleWrite('Mehrfach-Schlüssel im Quell-Array an Index: ' & $ret & @CRLF)
    $aList = _ObjSortedList_AsArray($oSL)
    _ArrayDisplay($aList, 'gefüllt aus Array')

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

    ;== Ausgabe Index ($a[n][0]), Schlüsselname ($a[n][1]) eines bestimmten Wertes
    ;== Anzahl gleicher Werte in ($a[0][0]), Wert in ($a[0][1])
    $aSameVal = _ObjSortedList_GetKeyByVal($oSL, 20)
    _ArrayDisplay($aSameVal, 'gleiche Werte')

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

    If MsgBox(262180,"Test INI","Das Bsp.-Skript erzeugt jetzt die Datei:" & @CRLF & _
    @ScriptDir & '\Test.ini' & @CRLF & "Soll die Datei erstellt werden?") = 6 Then

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

    ;== SortedList in INI speichern
    _ObjSortedList_WriteToIni($oSL, @ScriptDir & '\Test.ini', 'SortedList')
    If @error Then
    ConsoleWrite('Schreiben in INI fehlgeschlagen.' & @CRLF)
    Else
    ConsoleWrite('Schreiben in INI erfolgreich.' & @CRLF)

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

    ;== SortedList aus INI erstellen
    $oFromINI = _ObjSortedList_ReadFromIni(@ScriptDir & '\Test.ini', 'SortedList')
    $aList = _ObjSortedList_AsArray($oFromINI)
    _ArrayDisplay($aList, 'erstellt aus INI')
    EndIf

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

    EndIf

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

    If MsgBox(262180,"Test FILE","Das Bsp.-Skript erzeugt jetzt die Datei:" & @CRLF & _
    @ScriptDir & '\TestSort.lst' & @CRLF & "Soll die Datei erstellt werden?") = 6 Then

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

    ;== SortedList in Textdatei speichern (je Zeile: SCHLÜSSEL DELIMITER WERT @CRLF)
    _ObjSortedList_WriteToFile($oSL, @ScriptDir & '\TestSort.lst')
    If @error Then
    ConsoleWrite('Schreiben in FILE fehlgeschlagen.' & @CRLF)
    Else
    ConsoleWrite('Schreiben in FILE erfolgreich.' & @CRLF)

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

    ;== SortedList aus FILE erstellen
    $oFromFile = _ObjSortedList_ReadFromFile(@ScriptDir & '\TestSort.lst')
    $aList = _ObjSortedList_AsArray($oFromFile)
    _ArrayDisplay($aList, 'erstellt aus FILE')
    EndIf

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

    EndIf

    [/autoit]
  • Hallo.
    Die UDF ist dir wirklich gut gelungen. Sie ist einfach zu bedienen und nützlich für Array aufgaben.
    Außerdem konnte ich feststellen, dass es einem die Arbeit mit 2D Arrays vereinfacht.
    Also wie immer eine gute UDF von BufFix ;)
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.