Beispiel - Sortierung einer Zeichenkette
Beispiel - Sortierung einer Zeichenkette Zeichen in einer Zeichenkette alphabetisch sortieren
- Siehe: Cte-Befehle , Beispiel ohne Beschreibung
In diesem Beispiel wird eine Funktion vorgestellt, die den Inhalt einer Zeichenkette alphabetisch sortiert. Dabei werden alle Buchstaben, die doppelt in der Zeichenkette vorkommen, ignoriert.
Die zu sortierende Zeichenkette wird als erster Parameter übergeben. Im zweiten optionalen Parameter kann bestimmt werden, ob die Groß- und Kleinschreibung berücksichtigt werden soll. Wird in (aOrderCI) true übergeben, werden zunächst die Großbuchstaben und dann die kleinen Buchstaben sortiert.
Als Rückgabewert wird die sortierte Zeichenkette zurückgegeben.
sub OrderString
(
aString : alpha; // unsortierte Zeichenkette
opt aOrderCI : logic; // Groß-/Kleinwandlung beachten?
) : alpha;
Zur Verarbeitung werden einige Variablen benötigt:
local
{
tHdlTree : handle; // Deskriptor des Baums
tHdlItem : handle; // Deskriptor des Elementes
tCount : int; // Laufvariable
tStringOrdered : alpha(4096); // Sortierte Zeichenkette
}
Zuerst wird ein Baum erzeugt, in dem die Buchstaben der Zeichenkette eingepflegt werden. Abhängig davon, ob die Groß- und Kleinschreibung berücksichtigt werden soll, müssen unterschiedliche Bäume angelegt werden.
{
// Baum erzeugen
if (!aOrderCI)
tHdlTree # CteOpen(_CteTreeCI);
else
tHdlTree # CteOpen(_CteTree);
Anschließend wird für jedes Zeichen der Zeichenkette ein Element erzeugt und in den Baum integriert. Der Name des Elementes leitet sich dabei aus dem Buchstaben ab.
Existiert zu einem Buchstaben bereits ein Element, kann es nicht in den Baum eingefügt werden und wird gelöscht.
// Einlesen der Zeichenkette in einen Baum
for tCount # 1;
loop Inc(tCount);
while (tCount <= StrLen(aString))
{
tHdlItem # CteOpen(_CteItem);
tHdlItem->spName # StrCut(aString, tCount, 1);
if (!aOrderCI)
tHdlItem->spName # StrCnv(tHdlItem->spName, _StrLower);
if (!tHdlTree->CteInsert(tHdlItem))
{
// Element für diesen Buchstaben bereits vorhanden
tHdlItem->CteClose();
}
}
Danach wird der Baum sequenziell gelesen und aus den Namen der Elemente die sortierte Zeichenkette zusammengesetzt.
// Auslesen des Baums
for tHdlItem # tHdlTree->CteRead(_CteFirst)
loop tHdlItem # tHdlTree->CteRead(_CteNext, tHdlItem)
while (tHdlItem > 0)
{
tStringOrdered # tStringOrdered + tHdlItem->spName;
}
Jetzt können alle Elemente aus dem Baum und der Baum selbst gelöscht werden.
// Baum leeren und löschen
tHdlTree->CteClear(true);
tHdlTree->CteClose();
return(tStringOrdered);
}