Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   String in Array einlesen (https://www.delphipraxis.net/175184-string-array-einlesen.html)

jupiter4065139 4. Jun 2013 17:41

String in Array einlesen
 
Hallo,

ich hab hier ne kleine rechnung, in der ich ungefähr 100 Werte in jeweils 3 Spalten erzeugt habe und die dann als .txt ausgebe. So z.B.

Delphi-Quellcode:
mystring := Spalte1 + #9 + Spalte2 + #9 + Spalte3 + #13#10;


Ich möchte nun die Werte in Spalte 2 der Größe nach ordnen, mit den zugehörigen Werten aus Spalte 1 und 3.
Ich dachte nun, dass ich die Werte in ein Array einlese und danach den Quicksort oder BubbleSort Algorithmus darauf anwende. Bei mir fehlt es leider an Programmiererfahrung, wie ich das mache. Kann mir da bitte jemand helfen wie ich das am besten mache.

Vielen Dank

arnof 4. Jun 2013 21:36

AW: String in Array einlesen
 
mein Tipp speichere es in eine Datenbank ob echt oder Memory (TClientDataset) und lasse es dort sortieren ....

das ist viel weniger Code und schnell ist es auch noch

Sir Rufo 4. Jun 2013 21:40

AW: String in Array einlesen
 
Die alles entscheidende Frage: Für welche Delphi Version?

Mit den Generics ist das sehr simpel gemacht:
Delphi-Quellcode:
uses
  System.SysUtils,
  System.Generics.Defaults,
  System.Generics.Collections;

type
  TMyData = record
    Col1, Col2, Col3 : string;
  end;

var
  AList : TList<TMyData>;

  AList.Sort( TComparer<TMyData>.Construct(
    function ( const Left, Right : TMyData ) : Integer
    begin
      Result := CompareStr( Left.Col2, Right.Col2 );
    end ) );
und ohne Generics geht das so
Delphi-Quellcode:
type
  PMyData = ^TMyData;
  TMyData = record
    Col1, Col2, Col3 : string;
  end;

function CompareMyDataCol2( Item1, Item2 : Pointer ) : Integer;
begin
  Result := CompareStr( PMyData( Item1 ).Col2, PMyData( Item2 ).Col2 );
end;

var
  AList : TList;

  AList.Sort( @CompareMyDataCol2 );

arnof 5. Jun 2013 08:44

AW: String in Array einlesen
 
hallo jetzt muss ich als alter Delphi Profi (D5) echt mal dumm fragen, was machst Du da ?

Du vergleichst Strings, ok das gibt die Sortierreihenfolge, ruft die Sortfunktion deine procedure solange auf bis keine Veränderung mehr auftritt oder wie muss man das verstehen ?

musicman56 5. Jun 2013 08:52

AW: String in Array einlesen
 
@jupiter4065139

ich denke am einfachsten und schnellsten geht es, wenn du die Strings in eine TListBox einliest und die Property "Sorted" auf true setzt, und anschließend die TListBox.Items in eine Textdatei schreibst.

DeddyH 5. Jun 2013 09:12

AW: String in Array einlesen
 
Zitat:

Zitat von arnof (Beitrag 1217489)
hallo jetzt muss ich als alter Delphi Profi (D5) echt mal dumm fragen, was machst Du da ?

Du vergleichst Strings, ok das gibt die Sortierreihenfolge, ruft die Sortfunktion deine procedure solange auf bis keine Veränderung mehr auftritt oder wie muss man das verstehen ?

TList.Sort verwendet intern einen Quicksort. Dem muss man nun noch über einen Callback mitteilen wie die aktuellen Einträge zu vergleichen sind. Details dazu siehe unter TListSortCompare.

[edit] @musicman: das würde funktionieren, wenn es sich nur um einen String handeln würde, hier ist es aber ein Verbund aus mehreren Strings. Die muss man nun irgendwie zusammenhaltenm sei es in einem Record oder einer Klasse, und dann den Verbund vergleichen. [/edit]

Sir Rufo 5. Jun 2013 09:18

AW: String in Array einlesen
 
Zitat:

Zitat von arnof (Beitrag 1217489)
hallo jetzt muss ich als alter Delphi Profi (D5) echt mal dumm fragen, was machst Du da ?

Du vergleichst Strings, ok das gibt die Sortierreihenfolge, ruft die Sortfunktion deine procedure solange auf bis keine Veränderung mehr auftritt oder wie muss man das verstehen ?

Ich befolge den Rat von Obi Wan "Nutze die Kraft, Luke" :mrgreen:

Zitat:

Zitat von musicman56 (Beitrag 1217492)
@jupiter4065139

ich denke am einfachsten und schnellsten geht es, wenn du die Strings in eine TListBox einliest und die Property "Sorted" auf true setzt, und anschließend die TListBox.Items in eine Textdatei schreibst.

Öhm, lieber nicht ... das ist eine visuelle Komponente ... da würde man eher auf eine
Delphi-Quellcode:
TStringList
gehen ... aber einen Comparer an die Liste zu klatschen ist doch so was von fix gemacht, warum dieser Umstand?

musicman56 5. Jun 2013 09:30

AW: String in Array einlesen
 
Hallo Deddy,

das ist mir schon klar. Je nach dem wie du den String zusammensetzt wird auch sortiert. Für die Ausgabe kann man den string ja wieder anders zusammensetzen. Also beispielsweise SP2 + SP1 + SP3 als string sortieren und beim Ausgeben wieder SP1 + SP2 + SP3. So hab ich's jedenfalls gemeint. Sorry, wenn das falsch rüber gekommen ist.

Abgesehen davon, die Sortierfunktion von TList muss diese "Umsortierung" ja ebenfalls durchführen. Wenn der "Input" SP1+SP2+SP3 ist, aber nach SP2 sortiert werden soll, dann funktioniert ein einfacher string-sort nicht. Der string muss zuerst nach SP2+SP1+SP3 umgebaut werden. Oder ich habe den Sinn der Frage nicht ganz verstanden, was ich ja nicht ausschließen möchte.

Abgesehen davon, der Vorteil der Listbox ist meiner Ansicht nach, dass man das Ergebnis schon am BS betrachten kann.

Sir Rufo 5. Jun 2013 09:39

AW: String in Array einlesen
 
Klingt irgendwie danach mit einem Airbus A380 über die Autobahn an Paris und Rom vorbeizufahren, nur um den Nachbarn zu besuchen.

Blup 5. Jun 2013 09:50

AW: String in Array einlesen
 
Lange Rede, ...
Delphi-Quellcode:
uses
  Classes, SysUtils;

function GetTextCol(const AValue: string; AIndex: Integer): string;
var
  iPos: Integer;
begin
  Result := AValue;
  {Spalten 0 .. AIndex-1 löschen}
  while AIndex > 0 do
  begin
    iPos := Pos(Char(#9), Result);
    if iPos = 0 then
    begin
      Result := '';
      Exit;
    end;
    Delete(Result, 1, iPos);
    Dec(AIndex);
  end;
  {Spalten AIndex+1 löschen}
  iPos := Pos(Char(#9), Result);
  if iPos > 0 then
    Delete(Result, iPos, Length(Result));
end;

function MyCompareFn(List: TStringList; Index1, Index2: Integer): Integer;
var
  s1, s2: string;
begin
  s1 := GetTextCol(List[Index1], 1);
  s2 := GetTextCol(List[Index2], 1);
  if List.CaseSensitive then
    Result := AnsiCompareStr(s1, s2)
  else
    Result := AnsiCompareText(s1, s2);
end;

var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile('Text.txt');
    SL.CustomSort(MyCompareFn);
    SL.SaveToFile('MyText.txt');
  finally
    SL.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz