Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Letzten Eintrag in Stringlist ermitteln


Kralle - Di 15.11.11 15:36
Titel: Letzten Eintrag in Stringlist ermitteln
Hallo,

ohne die Liste in einer Schleife durchlaufen zu lassen, gibt es noch einen weg festzustellen, in welcher Zeile sich der Letzte Inhalt befindet?
Leerzeilen in der Mitte gibt es nicht.

MfG
Heiko


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 15.11.2011 um 16:28


Nersgatt - Di 15.11.11 15:44

Ja, die Stringlist hat die Eigenschaft "Count". Die gibt an, wie viele Einträge in der Liste sind.
Aber da die Liste 0-basiert ist, musst Du aufpassen. Der letzte Eintrag ist somit liste.strings[list.count - 1];


jaenicke - Di 15.11.11 18:16

Ich denke mal es geht um Leerzeilen, oder?

Und da gibt es theoretisch schon Möglichkeiten, aber die schnellste ist in einer Schleife von hinten angefangen nachzuschauen wie du meintest.


Gausi - Di 15.11.11 18:56

Oder man sucht den ersten Leerstring mit einer Binärsuche, wenn wirklich mittendrin keine Leerzeilen vorkommen.


Kralle - Mi 16.11.11 06:46

Moin,

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Oder man sucht den ersten Leerstring mit einer Binärsuche, wenn wirklich mittendrin keine Leerzeilen vorkommen.


Hast Du ein Beispiel für diese Suche?

MfG
Heiko


Nersgatt - Mi 16.11.11 07:22

Guck mal hier:
http://de.wikipedia.org/wiki/Bin%C3%A4rsuche

Da gibts unten einen Pseudocode, den musst Du nur nach Delphi übersetzen.


Gausi - Mi 16.11.11 07:49

Die gängige Binärsuche muss man ja etwas anpassen, da man ja nicht abbricht, wenn das Element gefunden wurde, sondern erst dann, wenn sich linke und rechte Suchgrenze treffen.

Ich würde das so probieren

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 links := 0;
rechts := Liste.count-1;
solange rechts > links mache
    mitte := (links + rechts) DIV 2;
    wenn Liste[mitte] = '' dann
        rechts := mitte - 1
    else
        links := mitte + 1;
ende
ergebnis := links/rechts +/- 1; // da müsste man nochmal genauer schauen, wie das aussieht, 
                         //ggf noch eine Fallunterscheidung