Italia
Foro

Teilstrings sortieren

 

Michael
Wodrich
Um Teilstrings in einem String zu sortieren nutzte ich bisher immer den Umweg circa
  • MoveStrToList (ab in die Listbox-Liste)
  • von dort rüber in un sortierte Liste
  • dann zurück in die Listbox-Liste
  • und letztendlich mit MoveListToStr

zum gewünschten Ergebnis.

Das es auch ein wenig kürzer geht, zeigt die zweite Version, die SortArray.inc necessario. Die lege ich auch bei.
KompilierenMarkierenSeparieren
' (in dieser Version ungeeignet für Zahlen; na ja, fast) Proc Sort_StrPart Parameters StrPart$, Trenner$ Declare Erg$, hListe& If (Len(StrPart$) = 0) or (Len(Trenner$) = 0) Erg$ = StrPart$ Else hListe& = Create("List",1)'sortierte Liste ClearList 0'lösche Listbox-Liste (LBL) MoveStrToList(StrPart$, Trenner$)'Teilstrings in LBL MoveListToHandle(hListe&)'in sortierte Liste ClearList 0 MoveHandleToList(hListe&)'zurück in LBL Erg$ = MoveListToStr$(Trenner$) ClearList 0' LBL sauber hinterlassen DestroyWindow(hListe&) Case Right$(Erg$,Len(Trenner$)) = Trenner$ : Erg$ = Left$(Erg$,Len(Erg$)-Len(Trenner$)) EndIf Return Erg$ EndProc $I SortArray.inc Proc Sort_StrPart2 Parameters StrPart$, Trenner$ Declare Erg$, hListe& If (Len(StrPart$) = 0) or (Len(Trenner$) = 0) Erg$ = StrPart$ Else ClearList 0'lösche Listbox-Liste (LBL) MoveStrToList(StrPart$, Trenner$)'Teilstrings in LBL QuickSort_List 0, 0, (GetCount(0) - 1), 1, 0 Erg$ = MoveListToStr$(Trenner$) ClearList 0' LBL sauber hinterlassen Case Right$(Erg$,Len(Trenner$)) = Trenner$ : Erg$ = Left$(Erg$,Len(Erg$)-Len(Trenner$)) EndIf Return Erg$ EndProc cls Print "Version:",$ProfVer;"\n" Declare Test$ Test$ = "Delta,Bravo,Echo,Charlie,Fuchstritt,Alfa" Print "alt:", Test$ Print "neu:", Sort_StrPart(Test$, ",");"\n" Test$ = "037;081;019;007;012;024;080" Print "alt:", Test$ Print "neu:", Sort_StrPart(Test$, ";");"\n" Test$ = "Delta,Bravo,Echo,Charlie,Fuchstritt,Alfa" Print "(hier wurde der Umweg ausgelassen und die LBL direkt sortiert)" Print "alt:", Test$ Print "neu:", Sort_StrPart2(Test$, ",");"\n" Print "TASTE=Ende" Waia> End

Hier die SortArray.inc
KompilierenMarkierenSeparieren
/*
Array oder Liste (teil-)sortieren
Nicht vergessen: Arrays und Listen haben die Basis Null.
QuickSort_List ist nicht für sortierte Listen gedacht.
Da ich aber häufiger die Listbox-Liste in eine (sortierte)
Liste umgepackt habe und dann das Ganze wieder in die
Gegenrichtung bewegen mußte...
- das A u O um die Listbox-Liste zu sortieren.
- auch sinnvoll, wenn in unsortierten Listen
nur ein Teil der Einträge sortiert werden soll.
*/
' (Teil-)Sortieren von Arrays
' ---------------------------
' QuickSort_Long Long_Array&[], min&, max&
' QuickSort_Str String_Array&[], min&, max&, CaseSense%
'    Wenn CaseSense ungleich Null ist, dann werden
'    die Strings als Lower$()-Werte verglichen.
' Teil-Sortieren von Listen
' -------------------------
' QuickSort_List ListHandle&, min&, max&, CaseSense%, IsNum%
'    Wenn ListHandle& = 0, dann Listbox-Liste.
'    Wenn IsNum ungleich Null ist, dann werden
'    die Werte mittels Val() verglichen -- sonst... --
'       Wenn CaseSense ungleich Null ist, dann werden
'       die Strings als Lower$()-Werte verglichen.
'=================================================
' (Teil-)Sortieren von Arrays
' ---------------------------
' QuickSort_Long Long_Array&[], min&, max&

Proc QuickSort_Long

    Parameters Arr&[], Low&, High&
    Declare i&, j&, hilf&, mitte&
    i& = Low&
    j& = High&
    mitte& = Arr&[@Int((Low& + High&) / 2)]

    While i& <= j&

        While Arr&[i&] < mitte&

            Inc i&

        EndWhile

        While Arr&[j&] > mitte&

            Dec j&

        EndWhile

        If i& <= j&

            hilf& = Arr&[i&]
            Arr&[i&] = Arr&[j&]
            Arr&[j&] = hilf&
            Inc i&
            Dec j&

        EndIf

    EndWhile

    If Low& < j&

        QuickSort_Long Arr&[], Low&, j&

    EndIf

    If i& < High&

        QuickSort_Long Arr&[], i&, High&

    EndIf

EndProc

' (Teil-)Sortieren von Arrays
' ---------------------------
' QuickSort_Str String_Array&[], min&, max&, CaseSense%
'    Wenn CaseSense ungleich Null ist, dann werden
'    die Strings als Lower$()-Werte verglichen.

Proc QuickSort_Str

    Parameters Arr$[], Low&, High&, CaseSense%
    Declare i&, j&, hilf$, mitte$

    Proc QS_GetStr$

        Parameters Wert$
        Return If( CaseSense% <> 0, Lower$(Wert$), Wert$ )

    EndProc

    i& = Low&
    j& = High&
    mitte$ = QS_GetStr$(Arr$[@Int((Low& + High&) / 2)])

    While i& <= j&

        While QS_GetStr$(Arr$[i&]) < mitte$

            Inc i&

        EndWhile

        While QS_GetStr$(Arr$[j&]) > mitte$

            Dec j&

        EndWhile

        If i& <= j&

            hilf$ = Arr$[i&]
            Arr$[i&] = Arr$[j&]
            Arr$[j&] = hilf$
            Inc i&
            Dec j&

        EndIf

    EndWhile

    If Low& < j&

        QuickSort_Str Arr$[], Low&, j&, CaseSense%

    EndIf

    If i& < High&

        QuickSort_Str Arr$[], i&, High&, CaseSense%

    EndIf

EndProc

' Teil-Sortieren von Listen
' -------------------------
' QuickSort_List ListHandle&, min&, max&, CaseSense%, IsNum%
'    Wenn ListHandle& = 0, dann Listbox-Liste.
'    Wenn IsNum ungleich Null ist, dann werden
'    die Werte mittels Val() verglichen -- sonst... --
'       Wenn CaseSense ungleich Null ist, dann werden
'       die Strings als Lower$()-Werte verglichen.

Proc QuickSort_List

    Parameters ListHandle&, Low&, High&, CaseSense%, IsNum%
    Declare i&, j&, hilfS$, mitteS$, hilfL&, mitteL&, tmp$

    Proc QS_Get

        Parameters Idx&, Ori%

        If Ori%

            Return GetString$(ListHandle&, Idx&)

        Else

            If IsNum%

                Return Val(GetString$(ListHandle&, Idx&))

            Else

                ' noch ein Sortiertrick - die Umlaute umsetzen
                tmp$ = GetString$(ListHandle&, Idx&)
                tmp$ = Translate$(tmp$,"Ä","Ae")
                tmp$ = Translate$(tmp$,"Ö","Oe")
                tmp$ = Translate$(tmp$,"Ü","Ue")
                tmp$ = Translate$(tmp$,"ä","ae")
                tmp$ = Translate$(tmp$,"ö","oe")
                tmp$ = Translate$(tmp$,"ü","ue")
                tmp$ = Translate$(tmp$,"ß","ss")
                Return If( CaseSense% <> 0, Lower$(tmp$), tmp$ )

            EndIf

        EndIf

    EndProc

    Proc QS_Put

        Parameters Idx&, Wert$
        ReplaceString(ListHandle&, Idx&, Wert$)

    EndProc

    i& = Low&
    j& = High&

    If IsNum%

        mitteL& = QS_Get(@Int((Low& + High&) / 2), 0)

    Else

        mitteS$ = QS_Get(@Int((Low& + High&) / 2), 0)

    EndIf

    While i& <= j&

        If IsNum%

            While QS_Get(i&,0) < mitteL&

                Inc i&

            EndWhile

            While QS_Get(j&,0) > mitteL&

                Dec j&

            EndWhile

        Else

            While QS_Get(i&,0) < mitteS$

                Inc i&

            EndWhile

            While QS_Get(j&,0) > mitteS$

                Dec j&

            EndWhile

        EndIf

        If i& <= j&

            hilfS$ = QS_Get(i&,1)
            QS_Put(i&, QS_Get(j&,1))
            QS_Put(j&, hilfS$)
            Inc i&
            Dec j&

        EndIf

    EndWhile

    If Low& < j&

        QuickSort_List ListHandle&, Low&, j&, CaseSense%, IsNum%

    EndIf

    If i& < High&

        QuickSort_List ListHandle&, i&, High&, CaseSense%, IsNum%

    EndIf

EndProc


Saluto
Michael Wodrich
 
XProfan X2
Windows (TM) Vista Ultimate, Core(TM) i7 920 @ 2.67GHz, 9206,26 MB

Programmieren, das spannendste Detektivspiel der Welt.
11.03.2014  
 




p.specht

Vielen Dank, klappt gut!
 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
17.03.2014  
 



Warum postest Du die nicht unter Include? Dann würden sie auch besser gefunden und Dein Profilo entsprechend automatisch erweitert.
 
09.07.2014  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.761 Views

Untitledvor 0 min.
H.Brill03.12.2022
RudiB.26.04.2022
kustg02.03.2020
Walter07.06.2019
Di più...

Themeninformationen

Dieses Thema hat 3 subscriber:

iF (1x)
p.specht (1x)
Michael Wodrich (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie