Michael Wodrich | Um Teilstrings dans einem String trop sortieren nutzte je bisher toujours den le détour sur
- MoveStrToList (ab dans qui Listbox-liste)
- de là rüber dans un sortierte liste
- ensuite zurück dans qui Listbox-liste
- et letztendlich avec MoveListToStr
zum gewünschten Ergebnis.
cela es aussi un peu kürzer allez, zeigt qui zweite Version, qui SortArray.inc nécessaire. qui lege je aussi chez. KompilierenMarqueSéparation
' (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%
' si CaseSense ungleich zéro ist, ensuite volonté
' qui Cordes comme Lower$()-Werte verglichen.
' partie-Sortieren de Listen
' -------------------------
' QuickSort_List ListHandle&, min&, max&, CaseSense%, IsNum%
' si ListHandle& = 0, ensuite Listbox-liste.
' si IsNum ungleich zéro ist, ensuite volonté
' qui Werte mittels Val() verglichen -- sonst... --
' si CaseSense ungleich zéro ist, ensuite volonté
' qui Cordes comme Lower$()-Werte verglichen.
'=================================================
' (partie-)Sortieren de Arrays
' ---------------------------
' QuickSort_Long Long_Array&[], min&, max&
Proc QuickSort_Long
Paramètres Arr&[], Low&, High&
Déclarer i&, j&, hilf&, mitte&
i& = Low&
j& = High&
mitte& = Arr&[@Int((Low& + High&) / 2)]
Tandis que i& <= j&
Tandis que Arr&[i&] < mitte&
Inc i&
Endwhile
Tandis que Arr&[j&] > mitte&
Décembre j&
Endwhile
Si i& <= j&
hilf& = Arr&[i&]
Arr&[i&] = Arr&[j&]
Arr&[j&] = hilf&
Inc i&
Décembre j&
EndIf
Endwhile
Si Low& < j&
QuickSort_Long Arr&[], Low&, j&
EndIf
Si i& < High&
QuickSort_Long Arr&[], i&, High&
EndIf
ENDPROC
' (partie-)Sortieren de Arrays
' ---------------------------
' QuickSort_Str String_Array&[], min&, max&, CaseSense%
' si CaseSense ungleich zéro ist, ensuite volonté
' qui Cordes comme Lower$()-Werte verglichen.
Proc QuickSort_Str
Paramètres Arr$[], Low&, High&, CaseSense%
Déclarer i&, j&, hilf$, mitte$
Proc QS_GetStr$
Paramètres Wert$
Retour Si( CaseSense% <> 0, Lower$(Wert$), Wert$ )
ENDPROC
i& = Low&
j& = High&
mitte$ = QS_GetStr$(Arr$[@Int((Low& + High&) / 2)])
Tandis que i& <= j&
Tandis que QS_GetStr$(Arr$[i&]) < mitte$
Inc i&
Endwhile
Tandis que QS_GetStr$(Arr$[j&]) > mitte$
Décembre j&
Endwhile
Si i& <= j&
hilf$ = Arr$[i&]
Arr$[i&] = Arr$[j&]
Arr$[j&] = hilf$
Inc i&
Décembre j&
EndIf
Endwhile
Si Low& < j&
QuickSort_Str Arr$[], Low&, j&, CaseSense%
EndIf
Si i& < High&
QuickSort_Str Arr$[], i&, High&, CaseSense%
EndIf
ENDPROC
' partie-Sortieren de Listen
' -------------------------
' QuickSort_List ListHandle&, min&, max&, CaseSense%, IsNum%
' si ListHandle& = 0, ensuite Listbox-liste.
' si IsNum ungleich zéro ist, ensuite volonté
' qui Werte mittels Val() verglichen -- sonst... --
' si CaseSense ungleich zéro ist, ensuite volonté
' qui Cordes comme Lower$()-Werte verglichen.
Proc QuickSort_List
Paramètres ListHandle&, Low&, High&, CaseSense%, IsNum%
Déclarer i&, j&, hilfS$, mitteS$, hilfL&, mitteL&, tmp$
Proc QS_Get
Paramètres Idx&, Ori%
Si Ori%
Retour GetString$(ListHandle&, Idx&)
D'autre
Si IsNum%
Retour Val(GetString$(ListHandle&, Idx&))
D'autre
' encore un Sortiertrick - qui 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")
Retour Si( CaseSense% <> 0, Lower$(tmp$), tmp$ )
EndIf
EndIf
ENDPROC
Proc QS_Put
Paramètres Idx&, Wert$
ReplaceString(ListHandle&, Idx&, Wert$)
ENDPROC
i& = Low&
j& = High&
Si IsNum%
mitteL& = QS_Get(@Int((Low& + High&) / 2), 0)
D'autre
mitteS$ = QS_Get(@Int((Low& + High&) / 2), 0)
EndIf
Tandis que i& <= j&
Si IsNum%
Tandis que QS_Get(i&,0) < mitteL&
Inc i&
Endwhile
Tandis que QS_Get(j&,0) > mitteL&
Décembre j&
Endwhile
D'autre
Tandis que QS_Get(i&,0) < mitteS$
Inc i&
Endwhile
Tandis que QS_Get(j&,0) > mitteS$
Décembre j&
Endwhile
EndIf
Si i& <= j&
hilfS$ = QS_Get(i&,1)
QS_Put(i&, QS_Get(j&,1))
QS_Put(j&, hilfS$)
Inc i&
Décembre j&
EndIf
Endwhile
Si Low& < j&
QuickSort_List ListHandle&, Low&, j&, CaseSense%, IsNum%
EndIf
Si i& < High&
QuickSort_List ListHandle&, i&, High&, CaseSense%, IsNum%
EndIf
ENDPROC
Salut Michael Wodrich |
|