![]() |
Re: Stringliste Umkehren
Hallo Klaus
Deine Lösung funktioniert soweit ganz gut und schnell. Und sieht auch gut aus ;-) Allerbesten Dank (auch an die anderen!) Simon |
Re: Stringliste Umkehren
Ist das mit dem Downto nicht selbsterklärend ? :shock:
Delphi-Quellcode:
Der Rest, Exchange usw. und sonstige Verrenkungen sind eher entsetzlich. :mrgreen:
unit Test;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Gauges; type TForm1 = class(TForm) memo1: TMemo; memo2: TMemo; btn1: TButton; procedure FormCreate(Sender: TObject); procedure btn1Click(Sender: TObject); private { Private-Deklarationen } sl : TStringlist; public { Public-Deklarationen } end; var Form1: TForm1; implementation uses DateUtils; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i : Integer; begin sl := TStringlist.Create; for i := 0 to 10 do sl.Add(IntToStr(i)); memo1.Lines := sl; // Stringlist-Inhalt an Memo übergeben end; procedure TForm1.btn1Click(Sender: TObject); var i : Integer; begin memo2.Lines.Clear; for i := sl.Count - 1 downto 0 do memo2.Lines.Add (memo1.Lines[i]) // in umgekehrter Reihenfolge in 2. Memo schieben end; end. |
Re: Stringliste Umkehren
Zitat:
|
Re: Stringliste Umkehren
Das geht btw. auch ohne downto, indem man statt Add Insert an Position 0 anwendet :zwinker:
|
Re: Stringliste Umkehren
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
So sieht das intern aus. Und elegant ist IMHO lesbarer Quelltext. Wer meine 7 relevanten Zeilen nicht versteht, der tut mir leid. :mrgreen: Ergebnis : siehe Anhang.
procedure TStringList.Exchange(Index1, Index2: Integer);
begin if (Index1 < 0) or (Index1 >= FCount) then Error(@SListIndexError, Index1); if (Index2 < 0) or (Index2 >= FCount) then Error(@SListIndexError, Index2); Changing; ExchangeItems(Index1, Index2); Changed; end; procedure TStringList.ExchangeItems(Index1, Index2: Integer); var Temp: Integer; Item1, Item2: PStringItem; begin Item1 := @FList^[Index1]; Item2 := @FList^[Index2]; Temp := Integer(Item1^.FString); Integer(Item1^.FString) := Integer(Item2^.FString); Integer(Item2^.FString) := Temp; Temp := Integer(Item1^.FObject); Integer(Item1^.FObject) := Integer(Item2^.FObject); Integer(Item2^.FObject) := Temp; end; |
Re: Stringliste Umkehren
Äh, ja. Ich gebs auf. Bin ich hier irgendeinem running gag zum Opfer gefallen?
|
Re: Stringliste Umkehren
Hansa, welche Methode ist eigentlich schneller? Deine in Fachkreisen genannte 'Downto'-Methode, oder das Vertauschen? Soweit ich mich erinnere, ging es im Post darum.
Zitat:
Aber wenn Du schon so argumentierst, dann ist erstens jede Stringzuweisung unelegant, da der Compiler ja 'Magic' mit reincodiert, und zweitens die Add-Methode auch nicht gerade elegant. Da wird erst zu AddObject gesprungen, um dann zu InsertItem zu springen und dann wird u.U. erstmal der gesammte Speicher vergrößert und umkopiert, damit danach nochmal Speicher verschoben wird. Ahhhh ja., Äh.. *räusper*.. Elegant? :gruebel: Also, Hansa, ich weiss nicht.
Delphi-Quellcode:
:gruebel: Elegant sieht anders aus. :mrgreen:
function TStringList.Add(const S: string): Integer;
begin Result := AddObject(S, nil); end; function TStringList.AddObject(const S: string; AObject: TObject): Integer; begin if not Sorted then Result := FCount else if Find(S, Result) then case Duplicates of dupIgnore: Exit; dupError: Error(@SDuplicateString, 0); end; InsertItem(Result, S, AObject); end; procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject); begin Changing; if FCount = FCapacity then Grow; if Index < FCount then System.Move(FList^[Index], FList^[Index + 1], (FCount - Index) * SizeOf(TStringItem)); with FList^[Index] do begin Pointer(FString) := nil; FObject := AObject; FString := S; end; Inc(FCount); Changed; end; Zitat:
Lern mal wieder argumentieren. So wird das nix mehr. |
Re: Stringliste Umkehren
Liste der Anhänge anzeigen (Anzahl: 1)
.. um das ganze einmal zu untermauern.
Getestet habe ich so:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var sl : TStringList; sl2 : TstringList; tick1 : Longword; i,j : longint; begin sl := TstringList.create; sl2 := TStringList.create; StatusBar1.Panels[0].Text:=''; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'testFile.txt'); tick1 := GetTickCount; for i:=sl.Count -1 downto 0 do sl2.add(sl[i]); label4.Caption := IntToStr(GetTickCount - tick1); StatusBar1.Panels[0].Text:='downto fertig'; sl.Free; sl2.Free; sl := TstringList.create; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'testFile.txt'); tick1 := GetTickCount; for i:=sl.count -1 downto (sl.count -1) div 2 do begin sl.Exchange(i,sl.count -1 -i); end; label5.Caption:= IntToStr(GetTickCount - tick1); StatusBar1.Panels[0].Text:='exchange fertig'; sl.free; StatusBar1.Panels[0].Text:='fertig'; end; mit einer 350MByte Datei. Herausgekommen ist, das was im Screenshot zu sehen ist. Grüße Klaus |
Re: Stringliste Umkehren
Hi,
es geht doch hier wohl um Geschwindigkeit und eine Stringlist. In der Aufgabenstellung taucht kein Memo und keine Objekte an der Stringlist auf. Damit ist der Code von inherited IMHO unschlagbar der schnellste und eleganteste. Gruss |
Re: Stringliste Umkehren
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
TestCode:
Delphi-Quellcode:
Ergebnis im Anhang.
procedure TForm1.Button2Click(Sender: TObject);
var sl : TStringList; sl2 : TstringList; tick1 : Longword; i,j : longint; s: String; begin sl := TstringList.create; sl2 := TStringList.create; StatusBar1.Panels[0].Text:=''; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'testFile.txt'); tick1 := GetTickCount; for i:=sl.Count -1 downto 0 do sl2.add(sl[i]); label4.Caption := IntToStr(GetTickCount - tick1); StatusBar1.Panels[0].Text:='downto fertig'; sl.Free; sl2.Free; sl := TstringList.create; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'testFile.txt'); tick1 := GetTickCount; for i:=sl.count -1 downto (sl.count -1) div 2 do begin sl.Exchange(i,sl.count -1 -i); end; label5.Caption:= IntToStr(GetTickCount - tick1); StatusBar1.Panels[0].Text:='exchange fertig'; sl.free; sl := TstringList.create; sl.LoadFromFile(ExtractFilePath(ParamStr(0))+'testFile.txt'); tick1 := GetTickCount; for i:=0 to (sl.count -1) div 2 do begin s:=sl[i]; sl[i]:=sl[sl.Count-i-1]; sl[sl.Count-i-1]:=s; end; label7.Caption:= IntToStr(GetTickCount - tick1); StatusBar1.Panels[0].Text:='exchange fertig'; sl.free; StatusBar1.Panels[0].Text:='fertig'; end; Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz