![]() |
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 |
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 |
AW: String in Array einlesen
Die alles entscheidende Frage: Für welche Delphi Version?
Mit den Generics ist das sehr simpel gemacht:
Delphi-Quellcode:
und ohne Generics geht das so
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 ) );
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 ); |
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 ? |
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. |
AW: String in Array einlesen
Zitat:
![]() [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] |
AW: String in Array einlesen
Zitat:
Zitat:
Delphi-Quellcode:
gehen ... aber einen Comparer an die Liste zu klatschen ist doch so was von fix gemacht, warum dieser Umstand?
TStringList
|
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. |
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.
|
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 08:05 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 by Thomas Breitkreuz