2010-11-28 5 views
4

Dies ist eine sortierte Listenansicht mit 50000 Elementen (Strings) in Delphi. Wie schnell Elemente mit denselben Wörtern mit Präfix suchen und Schleife überspringen?Wie kann man aus dieser Schleife aussteigen?

Die Liste ist wie:

aa..... 
ab cd//from here 
ab kk 
ab li 
ab mn 
ab xy// to here 
ac xz 
... 

Ich meine, wie Sie zu fasten und zu kopieren Elemente mit Präfixen ab und Schleife überspringen aus. Angenommen, der Index eines der ab-Elemente wird in einer Binärsuche gefunden. Der Index von ab cd nach ab xy wird durch eine binäre Suche erhalten.

Vielen Dank.

Edit: Wir danken allen für Ihre Antworten.

+0

Da Sie wissen, einen binären Chop zu verwenden, um die ersten und letzten Elemente des Bereichs zu finden, scheinen Sie bereits Ihre eigene Frage beantwortet zu haben. Wofür brauchst du genau Hilfe? –

Antwort

6

Wenn Sie etwas schnell, don‘ t speichern Sie Ihre Daten in einem TListView.

Verwenden Sie eine TStringList, um Ihre Liste zu speichern, und verwenden Sie dann eine TListView im virtuellen Modus.

Das Lesen von TStringList.Items [] ist viel schneller als das Lesen von einer TListView.Items [] -Eigenschaft.

Wenn Sie sicher sind, dass kein Hohlraum Element in der Liste vorhanden ist, verwendet diese:

procedure Extract(List, Dest: TStrings; Char1, Char2: char); 
var i,j: integer; 
    V: cardinal; 
type PC = {$ifdef UNICODE}PCardinal{$else}PWord{$endif}; 
begin 
    V := ord(Char1)+ord(Char2) shl (8*sizeof(char)); 
    Dest.BeginUpdate; 
    Dest.Clear; 
    for i := 0 to List.Count-1 do begin 
    if PC(pointer(List[i]))^=V then begin 
    for j := i to List.Count-1 do begin 
     Dest.Add(List[j]); 
     if PC(pointer(List[j]))^<>V then 
     break; // end the for j := loop 
    end; 
    break; // end the for i := loop 
    end; 
    Dest.EndUpdate; 
end; 

Sie binäre Suche verwenden können, es noch schneller zu bekommen. Aber mit dem Trick PWord() auf einer Liste von 50000 Elementen werden Sie es nicht bemerken.

Beachten Sie, dass PC (Zeiger (Liste [i]))^= V ist eine schnellere Version von Kopie (List [i], 1,2) = Char1 + Char2, da keine temporäre Zeichenfolge während des Vergleichs erstellt wird. Aber es funktioniert nur, wenn keine List [i] = '', d. H. Kein Zeiger (List [i]) = Nil.

Ich habe einen {$ ifdef UNICODE} und sizeof (char) hinzugefügt, damit dieser Code mit allen Versionen von Delphi kompiliert werden kann (vor und nach Delphi 2009).

+0

Sehr geehrte A. Bouchez: Vielen Dank für so detaillierte und klare Antwort. – Dylan

4

Um die Ausführung einer Schleife zu stoppen, verwenden Sie den Befehl break. Exit ist auch nützlich, um eine ganze Funktion zu verlassen, besonders wenn Sie mehrere verschachtelte Schleifen haben, um zu entkommen. Als letzten Ausweg können Sie goto verwenden, um aus mehreren verschachtelten Schleifen herauszuspringen und in derselben Funktion weiter zu laufen.

Wenn Sie einen while oder repeat Schleife statt einer for Schleife verwenden, die Sie eine andere conjunct in Ihrem Stopp-Bedingung enthalten, die Sie Mitte-Loop-Set:

i := 0; 
found := False; 
while (i < count) and not found do begin 
    // search for items 
    found := True; 
    // more stuff 
    Inc(i); 
end; 
+0

Lieber Rob Kennedy, nochmals vielen Dank für Ihre sofortige und klare Antwort. Wir haben keine gefundene Flag hinzugefügt und 'for ... loop' verwendet, also von geringer Leistung. – Dylan

Verwandte Themen