- 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
;===============================================================================
; 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
Bsp. Skript
#include-once
#include <Array.au3>
#include 'objSortedList.au3'
;== Sortierte Liste erstellen
$oSL = _ObjSortedList_Create()
;== 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)
;== Anzahl Schlüssel-Wertpaare ausgeben
ConsoleWrite('Anzahl Paare: ' & _ObjSortedList_Count($oSL) & @CRLF & @CRLF)
;== alle Schlüssel-Wertpaare als Array(2D) ausgeben
$aList = _ObjSortedList_AsArray($oSL)
_ArrayDisplay($aList, 'Schlüssel-Wert Paare')
;== alle Schlüssel als Array(1D) ausgeben
$aList = _ObjSortedList_AsArray($oSL, 1)
_ArrayDisplay($aList, 'Schlüssel')
;== alle Werte als Array(1D) ausgeben
$aList = _ObjSortedList_AsArray($oSL, 2)
_ArrayDisplay($aList, 'Werte')
;== Wert für SchlüsselName ausgeben
ConsoleWrite('_GetValByKey(Apfel): ' & _ObjSortedList_GetValByKey($oSL, 'Apfel') & @CRLF & @CRLF)
;== Wert für Index ausgeben
ConsoleWrite('_GetValByIndex(4): ' & _ObjSortedList_GetValByIndex($oSL, 4) & @CRLF & @CRLF)
;== SchlüsselName für Index ausgeben
ConsoleWrite('Schlüsselname an Index(3): ' & _ObjSortedList_GetKeyByIndex($oSL, 3) & @CRLF & @CRLF)
;== 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)
;== Liste auf Werte prüfen
ConsoleWrite('Wert "10" enthalten? ' & _ObjSortedList_ContainsVal($oSL, 10) & @CRLF)
ConsoleWrite('Wert "17" enthalten? ' & _ObjSortedList_ContainsVal($oSL, 17) & @CRLF & @CRLF)
;== Wert über SchlüsselNamen ändern
_ObjSortedList_SetValByKey($oSL, 'Apfel', 6)
ConsoleWrite('neuer Wert "Apfel": ' & _ObjSortedList_GetValByKey($oSL, 'Apfel') & @CRLF & @CRLF)
;==Wert über Index ändern
_ObjSortedList_SetValByIndex($oSL, 1, 18)
ConsoleWrite('neuer Wert (1): ' & _ObjSortedList_GetValByIndex($oSL, 1) & @CRLF & @CRLF)
;== SchlüsselIndex abfragen
ConsoleWrite('Index(Erdbeere): ' & _ObjSortedList_GetIndexOfKey($oSL, 'Erdbeere') & @CRLF & @CRLF)
;== 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)
;== 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)
;== 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)
;== 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)
;== Klon der Liste erstellen und als Array ausgeben
$oClone = _ObjSortedList_Clone($oSL)
$aList = _ObjSortedList_AsArray($oClone)
_ArrayDisplay($aList, 'Schlüssel-Wert Paare')
;== Inhalt Ursprungsliste leeren (Liste bleibt als Objekt erhalten)
_ObjSortedList_Clear($oSL)
ConsoleWrite('Anzahl nach Löschen Liste: ' & _ObjSortedList_Count($oSL) & @CRLF & @CRLF)
;== 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')
;== 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')
If MsgBox(262180,"Test INI","Das Bsp.-Skript erzeugt jetzt die Datei:" & @CRLF & _
@ScriptDir & '\Test.ini' & @CRLF & "Soll die Datei erstellt werden?") = 6 Then
;== 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)
;== SortedList aus INI erstellen
$oFromINI = _ObjSortedList_ReadFromIni(@ScriptDir & '\Test.ini', 'SortedList')
$aList = _ObjSortedList_AsArray($oFromINI)
_ArrayDisplay($aList, 'erstellt aus INI')
EndIf
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
;== 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)
;== SortedList aus FILE erstellen
$oFromFile = _ObjSortedList_ReadFromFile(@ScriptDir & '\TestSort.lst')
$aList = _ObjSortedList_AsArray($oFromFile)
_ArrayDisplay($aList, 'erstellt aus FILE')
EndIf
EndIf
[/autoit]