AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String in Array einlesen

Ein Thema von jupiter4065139 · begonnen am 4. Jun 2013 · letzter Beitrag vom 14. Jun 2013
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
jupiter4065139

Registriert seit: 22. Mär 2013
23 Beiträge
 
#1

String in Array einlesen

  Alt 4. Jun 2013, 18:41
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.

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
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: String in Array einlesen

  Alt 4. Jun 2013, 22:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: String in Array einlesen

  Alt 4. Jun 2013, 22:40
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 );
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 5. Jun 2013 um 11:24 Uhr) Grund: Fehler im Non-Generic Teil behoben
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: String in Array einlesen

  Alt 5. Jun 2013, 09:44
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 ?

Geändert von arnof ( 5. Jun 2013 um 09:47 Uhr)
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#5

AW: String in Array einlesen

  Alt 5. Jun 2013, 09:52
@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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

AW: String in Array einlesen

  Alt 5. Jun 2013, 10:12
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: String in Array einlesen

  Alt 5. Jun 2013, 10:18
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"

@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 TStringList gehen ... aber einen Comparer an die Liste zu klatschen ist doch so was von fix gemacht, warum dieser Umstand?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#8

AW: String in Array einlesen

  Alt 5. Jun 2013, 10:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: String in Array einlesen

  Alt 5. Jun 2013, 10:39
Klingt irgendwie danach mit einem Airbus A380 über die Autobahn an Paris und Rom vorbeizufahren, nur um den Nachbarn zu besuchen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#10

AW: String in Array einlesen

  Alt 5. Jun 2013, 10:50
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr.
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