Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Stringliste Umkehren (https://www.delphipraxis.net/110189-stringliste-umkehren.html)

simon790 14. Mär 2008 13:54

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

Hansa 14. Mär 2008 16:21

Re: Stringliste Umkehren
 
Ist das mit dem Downto nicht selbsterklärend ? :shock:

Delphi-Quellcode:
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.
Der Rest, Exchange usw. und sonstige Verrenkungen sind eher entsetzlich. :mrgreen:

bluesbear 14. Mär 2008 16:27

Re: Stringliste Umkehren
 
Zitat:

Zitat von Hansa
Der Rest, Exchange usw. und sonstige Verrenkungen sind eher entsetzlich. :mrgreen:

Aber Hansa! Das irritiert mich jetzt. Das mit dem Exchange ist eine superelegante Lösung! Da müssen keine Speicherbereiche kopiert oder sonstwas gemacht werden, sondern nur ein paar Pointer vertauscht. Was schreibst denn Du da für einen... okok, ich werd wieder paranoid.

DeddyH 14. Mär 2008 16:48

Re: Stringliste Umkehren
 
Das geht btw. auch ohne downto, indem man statt Add Insert an Position 0 anwendet :zwinker:

Hansa 14. Mär 2008 16:49

Re: Stringliste Umkehren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von bluesbear
...Exchange ist eine superelegante Lösung! Da müssen keine Speicherbereiche kopiert oder sonstwas gemacht werden, sondern nur ein paar Pointer vertauscht. Was schreibst denn Du da für einen... okok, ich werd wieder paranoid.

Jo. :mrgreen: Siehe hier :

Delphi-Quellcode:
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;
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.

bluesbear 14. Mär 2008 16:58

Re: Stringliste Umkehren
 
Äh, ja. Ich gebs auf. Bin ich hier irgendeinem running gag zum Opfer gefallen?

alzaimar 14. Mär 2008 18:40

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:

Zitat von Hansa
Und elegant ist IMHO lesbarer Quelltext.

Den Quelltext der Exchange-Methode sieht man doch nicht.
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:
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;
:gruebel: Elegant sieht anders aus. :mrgreen:
Zitat:

Zitat von Hansa
Wer meine 7 relevanten Zeilen nicht versteht, der tut mir leid. :mrgreen:

Och, das ist nicht das Problem. das Problem scheint zu sein, das Du die drei(!) relevanten Zeilen vom bluesbear, die zudem noch schneller sind, nicht als kürzer, schneller, leichter zu lesen und eleganter empfindest. Oder ist ein Codefragment mit mehr als doppelt so viel Zeilen, das lahm ist, etwa elegant? :shock:

Lern mal wieder argumentieren. So wird das nix mehr.

Klaus01 14. Mär 2008 19:06

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

thkerkmann 14. Mär 2008 19:34

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

Klaus01 14. Mär 2008 19:52

Re: Stringliste Umkehren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von thkerkmann
Damit ist der Code von inherited IMHO unschlagbar der schnellste und eleganteste.

Gruss

Würde ich nicht so sagen:

TestCode:
Delphi-Quellcode:
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;
Ergebnis im Anhang.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.
Seite 2 von 4     12 34      

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