ArrayPlus-UDF - weitere Helferlein für den täglichen Umgang mit Arrays

  • Folgende UDF ist als Ergänzung zur Array.au3 gedacht, welche noch mehr ermöglicht, flexibler ist und grundsätzlich den Programmieralltag vereinfachen soll.
    Eigentlich habe ich nur eine Funktion basteln wollen, welche analog zu _ArrayDisplay Arrays hübsch in der Console ausgeben soll (die _Array2String()).
    Stattdessen sind ein paar feine Funktionen zusätzlich entstanden und diese habe ich dann durch bereits vorhandene thematisch passende Funktionen aus meiner DynArray.au3 ergänzt.

    Ich habe mir Mühe gegeben die UDF sauber und umfangreich durch Funktionsheader zu dokumentieren.
    Ebenso gibt es eine umfangreiche Beispieldatei dazu, welche den Umgang mit den wichtigsten Funktionen versucht zu veranschaulichen.

    Neben der vollständigen Funktionsliste unten hier meine persönlichen Highlights um eine erste Vorstellung zu erhalten:

    • _ArraySlice(): Slice Funktionalität wie von Python bekannt = Maximal flexible kompakt geschriebene Extraktion von Bereichen, Spalten, Zeilen etc. aus einem Array (Beispiel: _ArraySlice($aA, "[:-3][::-1]") = Alle Zeilen bis auf die 3 letzten zurückgeben und dabei die Reihenfolge der Spalten umdrehen) - die Beispiele in der _ArrayPlus_Examples.au3 lohnen hierzu.
    • _ArrayCreate(): Arrays inline erstellen als 1D/2D/array-in-array mit vorbelegten Werten oder Erstellung von Sequenzen wie von range (wieder Python) bekannt.
    • _Array2String(): Arrays endlich mal schick in der Console ausgeben, inkl. ausrichten am Dezimaltrennzeichen, Rahmen etc.
    • Sortieren, suchen, analysieren von Arrays, deren Werte eben keine Standardtypen sind sondern spezielle Sortier/Vergleichs-Verhältnisse haben.

    Funktionsliste:

    FunktionBeschreibung
    _ArraySliceTeile von Arrays extrahieren, umsortieren wie beim Array-Slicing von Python
    _ArrayCreateErstellung von 1D/2D-Arrays oder Array-In-Arrays in einer Code-Zeile; unterstützt python-ähnliche Range-Syntax zur Erstellung von Sequenzen
    _ArrayRangeCreateerzeugt eine Sequenz als 1D-Array - hauptsächlich Hilfsfunktion für _ArrayCreate
    _Array2dToAinAkonvertiert ein 2D-Array in ein Array-in-Array
    _ArrayAinATo2dkonvertiert ein Array-in-Array in ein 2D-Array
    _Array1DTo2Dkonvertiert ein 1DArray in ein 2D-Array und übernimmt dessen Werte in die 1. Spalte
    _Array2Stringgibt ein 1D/2D-Array übersichtlich auf der Konsole oder einer Variablen aus
    _ArrayJoinVerknüpfung von Arrays wie Joins in SQL
    _ArrayAddGeneratedColumnFügt eine Spalte ein, deren Wert sich aus den anderen Werten des Datensatzes ermitteln lässt (wie generated column in SQL)
    _ArrayAlignDecrichtet ein 1D-Array oder eine Spalte eines 2D-Arrays am Dezimalpunkt oder rechtsbündig aus
    _ArrayMapwendet eine Funktion auf jedes Element eines Arrays an
    _ArrayReducereduziert die Elemente eines Arrays auf einen Wert mit einer externen Funktion
    _ArrayFilterfiltert die Elemente eines Arrays mit einer externen Funktion
    _ArrayDeleteByConditionlöscht alle leeren String-Elemente oder solche, die eine benutzerdefinierte Bedingung in einem Array erfüllen
    _ArrayDeleteMultiValueslöscht alle Elemente in einem 1D, welche mehr als einmal auftreten (nicht nur die Duplikate! - also != _ArrayUnique)
    _ArrayRotaterotiert die Elemente/Zeilen eines 1D/2D-Arrays (verschieben aber dabei werden überlaufende Elemente auf der anderen Seite wieder erscheinen)
    _ArraySortFlexiblesortiert ein Array mit einer benutzerdefinierten Sortierregel
    _ArraySortInsertionsortiert ein Array mit einer benutzerdefinierten Sortierregel mit dem Insertion-Sort-Algorithmus
    _ArraySortSelectionsortiert ein Array mit einer benutzerdefinierten Sortierregel mit dem Selection-Sort-Algorithmus (minimale Anzahl von Vertauschungen)
    _ArrayIsSortedprüft, ob ein Array bereits sortiert ist (unter Verwendung einer benutzerdefinierten Vergleichsfunktion)
    _ArrayHeapSortBinarysortiert ein Array mit dem Binary-Min-Heap-Sort Algorithmus (mit Hilfe einer Benutzer-Vergleichsfunktion)
    _ArrayHeapSortTernarysortiert ein Array mit dem Ternary-Min-Heap-Sort Algorithmus (mit Hilfe einer Benutzer-Vergleichsfunktion)
    _ArrayMergeSortedFügt Werte aus einem sortierten Array oder einen einzelnen Wert in ein anderes sortiertes Array ein
    _ArrayBinarySearchFlexführt eine binäre Suche für ein entsprechend sortiertes Array unter Verwendung einer individuellen Vergleichsfunktion durch
    _ArrayFindSortedPosErmittelt die Einfügeposition eines Elementes in eine sortierte Menge
    _ArrayGetMaxermittelt das Element mit dem Maximalwert unter Verwendung einer Benutzervergleichsfunktion
    _ArrayGetMinermittelt das Element mit dem kleinsten Wert mit Hilfe einer Benutzervergleichsfunktion
    _ArrayMinMaxGrößter/kleinster Wert, sowie deren Indizes eines 1D-Arrays, einer Spalte eines 2D-Arrays oder aller Spalten
    _ArrayGetNthBiggestElementermittelt das n-te größte Element (z.B.: Medianwert) in einem unsortierten Array, ohne es zu sortieren (schneller)

    Edit: Thematisch eng verwandt ist die ArrayMore.au3 von BugFix . Hab die erst jetzt wieder entdeckt und gesehen, dass sie bereits einige Ideen vorweg genommen hat. Man könnte die also als eine Art geistigen Großvater meiner ArrayPlus-UDF betrachten. 8o

    >>Download und Quellcode auf GitHub<<

    9 Mal editiert, zuletzt von AspirinJunkie (12. Februar 2024 um 14:38) aus folgendem Grund: _ArrayJoin und _ArrayAddGeneratedColumn hinzugefügt

  • Changelog
    Datum Version Änderungen
    12.07.2022 0.2
    _Array1DTo2D()
    hinzugefügt
    _Array2String()
    Darstellung von Array-In-Arrays hinzugefügt
    _ArrayCreate()
    Exklusive Grenzen hinzugefügt (Runde-Klammer-Syntax), sowie Schrittanzahl anstatt Schritgröße hinzugefügt (Pipe "|"-Syntax)
    _ArrayMinMax()
    hinzugefügt
    _ArrayDeleteMultiValues()
    hinzugefügt
    14.12.2022 0.3
    _ArrayRangeCreate, _ArrayCreate, _ArrayMap, _ArrayFilter, _ArrayDeleteByCondition, _ArrayReduce, _ArrayGetMax, _ArrayGetMin, _ArrayMinMax, _ArrayGetNthBiggestElement, _ArraySortFlexible, _ArrayIsSorted, _ArrayBinarySearchFlex, _ArraySortInsertion, _ArraySortSelection, _ArrayHeapSortBinary, _ArrayHeapSortTernary
    Für benutzerdefinierte Funktionen ist nun auch direkt AutoIt-Code innerhalb eines Strings möglich.
    _ArrayFilter(), _ArrayDeleteByCondition()
    2D-Arrays können nun verarbeitet werden (in diesem Fall werden die Zeilen betrachtet)
    __ap_cb_comp_Natural()
    hinzugefügt - stellt eine Vergleichsfunktion für die Sortierungsfunktionen bereit, welche "natürlich" (wie im Explorer) sortiert.
    17.05.2023 0.4
    _ArrayRotate
    Funktion hinzugefügt

    4 Mal editiert, zuletzt von AspirinJunkie (17. Mai 2023 um 06:57)

  • Cooooool.

    Das sage ich ja selten. Aber genau über soetwas habe ich gerade nachgedacht. Also nicht Arry und so, sondern die eine oder andere Funktion die Du geschrieben hast kommt dem gleich, was ich dachte: Das wäre gut wenn das möglich wäre.

    Werde ich mir später ausführlich anschauen !

    DANKE ! ! !

    Lieben Gruß,
    Alina

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

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Auch von mir ein großes Dankeschön :thumbup:

    Einige der Features hatte ich mir in der Vergangenheit zwar bereits selbst "zusammengebastelt", aber natürlich nicht so sauber und schon gar nicht als kompakte UDF.

    Da ich noch (immer) mit der AutoIt 3.3.14.0. arbeite, habe ich exemplarisch _ArraySlice und _Array2String getestet - funktioniert tadellos :) .

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Vorab: Vielleicht habe ich einfach nicht gesehen, ob diese Funktionalität vorhanden ist. Dann ist dieser Beitrag obsolet.

    Vorallem wenn man mit z.B. Kugelkoordinaten, etc. arbeitet braucht man oft Intervalle (Range) mit inklusiven, oder exklusiven Rändern.

    z.B. Das Intervall [0, 2PI] ist NICHT dasselbe wie (0, 2PI). Dafür verwende ich gerne folgende Funktion:

    Das ermöglicht es einen kontinuierlichen Raum disket zu sampeln, während man gleichzeitig auswählen kann welchen Rand die Intervalle haben (Abgeschlossen, oder Offen).

    (Gilt natürlich in dieser Beispielfunktion nur für lineare Räume, wenn man hier eine Funktion anwendet wie x^2, dann stimmt das Sampling nicht mehr, sobald mindestens ein Rand offen ist)

    Das wäre ein Vorschlag für etwas das man hier ergänzen könnte (ich weiß aber nicht wie man das hier geschickt einbaut ohne unnötig viele Parameter zu haben, vielleicht wirklich via String parsing (also "(0, 1)" steht für das beidseitig offene Intervall, "[0, 1]" steht für das beidseitig abgeschlossene Intervall).

    lg

    M

  • Das wäre ein Vorschlag für etwas das man hier ergänzen könnte (ich weiß aber nicht wie man das hier geschickt einbaut ohne unnötig viele Parameter zu haben, vielleicht wirklich via String parsing (also "(0, 1)" steht für das beidseitig offene Intervall, "[0, 1]" steht für das beidseitig abgeschlossene Intervall).

    Der Vorschlag ist klasse. Ich denke ich werde die Syntax mit der runden Klammer genauso in die _ArrayCreate mit einbauen.

  • Ich habe nun beide Ergänzungen von dir in der _ArrayCreate() implementiert.

    Einmal die exklusiven Grenzen: indem man runde öffnende oder schließende Klammern verwendet.

    Zum anderen die Anzahl der Schritte: Hierzu einfach den 3. Wert anstatt mit ":" (=Schrittgröße) mit einer Pipe "|" abtrennen, dann wird die Schrittgröße selbstständig berechnet.

    Ansonsten gab's auch für andere Dinge ein Update und ein paar neue Funktionen.

  • Wow grad nur kurz _ArrayDisplay(_ArrayCreate("[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]]")) ausprobiert.

    funktioniert wie es aussieht perfekt. :thumbup:

  • Es gibt ein größeres Update.

    Hauptänderung ist es, dass für benutzerdefinierte Funktionen nicht mehr extra eine Funktion definiert werden muss, sondern der Code direkt als String übergeben werden kann.
    Dies ermöglicht es mit noch weniger Code ebenso viel zu erreichen.

    Um z.B. Elemente anhand ihrer Zeichenanzahl zu sortieren genügt nun eine einzige Zeile:

    AutoIt
     #include "ArrayPlus.au3"
    
    Global $aArray[] = ["AAA", "AA", "A", "AAAAA", "AA", "AAA", "A"]
    
    _ArraySortFlexible($aArray, "Stringlen($A) > Stringlen($B) ? 1 : Stringlen($A) < Stringlen($B) ? -1 : 0")
    
    _ArrayDisplay($aArray)

    Oder ebenso um z.B. alle Elemente, welche mit "B" beginnen aus dem Array herauszufiltern:

    AutoIt
    #include "ArrayPlus.au3"
    
    Local $a_Array = ["BASF", "Allianz", "Volkswagen", "BMW", "Bayer", "Telekom", "Post", "Linde"]
    _ArrayFilter($a_Array, 'StringLeft($A, 1) = "B"')
    If Not @error Then _ArrayDisplay($a_Array)

    Desweiteren habe ich 2D-Funktionalität für 2 Funktionen hinzugefügt und die Vergleichsfunktion für das "Natural sort" ist nun auch direkt in die UDF gewandert.
    Um nun ein Array "natürlich" zu sortieren benötigt es daher nun lediglich folgendes:

    AutoIt
    #include "ArrayPlus.au3"
    
    Global $aArr[] = ["image20.jpg","image1.jpg","image11.jpg","image2.jpg","image3.jpg","image10.jpg","image12.jpg","image21.jpg","image22.jpg","image23.jpg"]
    
    _ArraySortFlexible($aArr, __ap_cb_comp_Natural)
    _ArrayDisplay($aArr, "natural sorted array")
  • Oscar 15. Dezember 2022 um 13:55

    Hat das Thema freigeschaltet.
  • Es gibt ein Update welches in AutoIt zwei bekannte Features aus SQL einführt:

    Einmal ist die Funktion _ArrayJoin() hinzugekommen.
    Mit dieser kann man die Datensätze von zwei Arrays anhand gemeinsamer Werte (entweder direkte Werte oder eine eigene Berechnungsvorschrift) miteinander verknüpfen.
    Also im Grunde ein aus SQL bekanntes JOIN nun auch für AutoIt-Arrays (es werden hierbei sowohl inner, left, right und full outer join unterstützt).

    Zum Anderen kam die Funktion _ArrayAddGeneratedColumn() hinzu.
    Diese fügt eine Spalte dem Array hinzu, deren Wert sich aus den anderen Werten des jeweiligen Datensatzes berechnen lässt.
    In SQL ist dieses Konzept unter dem Namen "generated column" bekannt.