AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Sortieren eines Arrays of String

Ein Thema von DonPedroFo · begonnen am 8. Jul 2019 · letzter Beitrag vom 23. Jul 2019
Antwort Antwort
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
722 Beiträge
 
Delphi XE5 Professional
 
#1

AW: Sortieren eines Arrays of String

  Alt 10. Jul 2019, 15:14
Vermutlich gibt es die Funktion PadRight(..) in Delphi 5 noch nicht. DonPedroFo könnte jedoch wie folgt vorgehen:
Delphi-Quellcode:
function MyPadRight(Str_kurz: String; Ch: Char; Len_Soll: Integer): String;
var
  n_Ch: Integer;
  
begin
  Result:= Str_kurz;
  n_Ch:= Len_Soll - Length(Str_kurz);
  If n_Ch < 1 Then
    Exit;
    
  Result:= Str_kurz + StringOfChar(Ch, n_Ch); // oder MyStringOfChar(..) von oben
end;
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (10. Jul 2019 um 15:16 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Sortieren eines Arrays of String

  Alt 10. Jul 2019, 17:39
Sortierroutine von oben etwas angepasst:
Delphi-Quellcode:
const
  csFFFF = 'FFFFFFFFFFFFFF'; // Soviele F, wie maximal benötigt werden könnten.
  ciFFFF = 14; // Maximale Anzahl von F, die benötigt werden kann.

function FillFFFF(s : String) : String;
begin
  Result := s + Copy(csFFFF,1,ciFFFF - Length(s));
end;

procedure TForm1.SortMemo;
var
        i : Integer;
        k : Integer;
        s : String;
begin
  Memo1.BeginUpdate;
  // Zuerst alles mit F auf Pflichtlänge auffüllen
  for i := 0 to Memo1.Lines.Count - 1 do Memo1.Lines[i] := FillFFFF(Memo1.Lines[i]);
  // und dann sortieren.
  for i := 0 to Memo1.Lines.Count - 1 do begin
    for k := i + 1 to Memo1.Lines.Count - 1 do begin
      if Copy(Memo1.Lines[k],5,4) < Copy(Memo1.Lines[i],5,4) then begin
        s := Memo1.Lines[i];
        Memo1.Lines[i] := Memo1.Lines[k];
        Memo1.Lines[k] := s;
      end;
    end;
  end;
  Memo1.EndUpdate;
end;
  Mit Zitat antworten Zitat
DonPedroFo

Registriert seit: 26. Jun 2019
18 Beiträge
 
#3

AW: Sortieren eines Arrays of String

  Alt 11. Jul 2019, 08:04
Wahnsinn es Funktioniert auf anhieb.

Vielen Dank. Sowas nenn ich mal nützliche Hilfe.
  Mit Zitat antworten Zitat
DonPedroFo

Registriert seit: 26. Jun 2019
18 Beiträge
 
#4

AW: Sortieren eines Arrays of String

  Alt 11. Jul 2019, 11:38
@Delphi.Narium
Die Lösung ist schonmal perfekt.

Könnte ich, um das ganze etwas variabler zu schreiben,
die Zeilen

csFFFF = 'FFFFFFFFFFFFFF';
ciFFFF = 14;

irgendwie so schreiben

csFFFF = (Variable)'F'
ciFFFf = (Variable)

wenn als Variable z.b. 10 steht

csFFFF = 'FFFFFFFFFF' //10xF
ciFFFF = 10
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#5

AW: Sortieren eines Arrays of String

  Alt 11. Jul 2019, 12:14
Sortierroutine von oben etwas angepasst:
Delphi-Quellcode:

function Filler(s : String; sFillChar : Char; iLength : Integer) : String;
begin
  Result := s + Copy(DupeString(sFillChar, iLength), 1, iLength - Length(s));
end;

procedure TForm1.SortMemo;
var
        i : Integer;
        k : Integer;
        s : String;
begin
  Memo1.BeginUpdate;
  // Zuerst alles mit auf Pflichtlänge auffüllen
  for i := 0 to Memo1.Lines.Count - 1 do Memo1.Lines[i] := Filler(Memo1.Lines[i],'F',14);
  // und dann sortieren.
  for i := 0 to Memo1.Lines.Count - 1 do begin
    for k := i + 1 to Memo1.Lines.Count - 1 do begin
      if Copy(Memo1.Lines[k],5,4) < Copy(Memo1.Lines[i],5,4) then begin
        s := Memo1.Lines[i];
        Memo1.Lines[i] := Memo1.Lines[k];
        Memo1.Lines[k] := s;
      end;
    end;
  end;
  Memo1.EndUpdate;
end;
Wenn's noch flexibler sein soll, da bau ins Formular noch zwei Edits ein, z. B.: edFillChar für das Zeichen, mit dem aufgefüllt werden soll und edLineLength für die Länge, bis zu der die einzelnen Zeilen aufgefüllt werden sollen.
Delphi-Quellcode:
function Filler(s : String; sFillChar : Char; iLength : Integer) : String;
begin
  Result := s + Copy(DupeString(sFillChar, iLength), 1, iLength - Length(s));
end;

procedure TForm1.SortMemo;
var
        i : Integer;
        k : Integer;
        s : String;
        iLength : Integer;
        sFillChar : Char;
begin
  Memo1.BeginUpdate;
  iLength := StrToInt(Trim(edLineLength.Text));
  sFillChar := Copy(edFillChar.Text,1,1);
  // Zuerst alles mit auf Pflichtlänge auffüllen
  for i := 0 to Memo1.Lines.Count - 1 do Memo1.Lines[i] := Filler(Memo1.Lines[i],sFillChar,iLength);
  // und dann sortieren.
  for i := 0 to Memo1.Lines.Count - 1 do begin
    for k := i + 1 to Memo1.Lines.Count - 1 do begin
      if Copy(Memo1.Lines[k],5,4) < Copy(Memo1.Lines[i],5,4) then begin
        s := Memo1.Lines[i];
        Memo1.Lines[i] := Memo1.Lines[k];
        Memo1.Lines[k] := s;
      end;
    end;
  end;
  Memo1.EndUpdate;
end;
Falls Delphi 5 die Funktion DupeString noch nicht kennen sollte:
Delphi-Quellcode:
function DupeString(sZeichen : String; iAnzahl : Integer) : String;
var
  i : Integer;
begin
  Result := '';
  for i := 1 to iAnzahl do Result := Result + sZeichen;
end;

Geändert von Delphi.Narium (11. Jul 2019 um 13:22 Uhr) Grund: Fehler behoben (hoffentlich)
  Mit Zitat antworten Zitat
DonPedroFo

Registriert seit: 26. Jun 2019
18 Beiträge
 
#6

AW: Sortieren eines Arrays of String

  Alt 11. Jul 2019, 13:02
Jetzt bekomme ich "Nicht genügend wrikliche Parameter" an dieser Stelle

Musste die Function DubString noch erstellen da sie Delphi 5 anscheinend nicht hat

Result := s + Copy(DupeString(sFillChar, iLength), iLength - Length(s));
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#7

AW: Sortieren eines Arrays of String

  Alt 11. Jul 2019, 13:23
Da fehlt 'ne 1,

Hab's oben ergänzt.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Sortieren eines Arrays of String

  Alt 12. Jul 2019, 10:40
Wie erwähnt wurde, müsste man hier ja nicht sortieren.

Wenn doch: Eventuell möchten Frau oder Mann ja später irgendwann einmal grössere Arrays sortieren. Und da ist die Verwendung von TMemo.Lines sehr bald sehr langsam (auch mit ..BeginUpdate, ..EndUpdate).

Auf meiner Kiste für 1000 Elemente. Sortieren über TMemo.Lines ~1200ms, Code unten: ~5ms (maximal "unsortiert"). Bei 5000 Elementen: Sortieren über TMemo.Lines ~32sec, Code unten: ~15ms (wenn bereits sortiert) ~60ms ("maximal "unsortiert")

Du kannst dabei TStringList.Sort fürs Sortieren verwenden (oder auch deinen Bubble Code). Sort ist natürlich etwas schneller

Delphi-Quellcode:
var ts : TStringList;
...

// Inhalt von Memo in die StringList schreiben:
  ts.Text := memo1.Lines.Text;

// Der Teil T, nach welchem sortiert werden soll wird zusätzlich an den Anfang der zu sortierenden Strings geschrieben:
  for i := 0 to ts.Count-1 do
  begin
    hs := ts.Strings[i];
    ts.Strings[i] := Copy( hs,5,4) + hs;
  end;

// Sortieren mit Sort oder Bubble oder wie auch immer
  ts.Sort;

// T löschen
  for i := 0 to ts.Count-1 do
  begin
    hs := ts.Strings[i];
    Delete( hs, 1, 4 );
    ts.Strings[i] := hs;
  end;

// zurück schreiben:
  memo1.Lines.Text := ts.Text;
Michael Gasser

Geändert von Michael II (12. Jul 2019 um 15:08 Uhr)
  Mit Zitat antworten Zitat
DonPedroFo

Registriert seit: 26. Jun 2019
18 Beiträge
 
#9

AW: Sortieren eines Arrays of String

  Alt 22. Jul 2019, 12:03
WOW..., @Michael Danke, das Sortieren mit deinem Code geht ja mal deutlich schneller
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:31 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