Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Sortierung; (https://www.delphipraxis.net/176753-sortierung%3B.html)

Mokus 24. Sep 2013 15:48

Delphi-Version: XE2

Sortierung;
 
N´abend;

hab mal ne frage.
wollt mir ein Algyruthmus schreiben mit dem ich sortieren kann.

Sortierungsobjekt wäre ein array.
Die Größe des Arrays variert.
Nun möchte ich diese nach der Größte sortieren und verlagert.
der größte Wert soll auf eine stringlist verlegt werden. (st_list3);
Der Index, den der Wert hatte, soll erhalten bleiben und auf eine zweite stringlist zugreifen (st_list2);
Mit dem gleichen Index ist auf den ist auf st_list2 ein Wort hinterlegt, dies würde ich auch gern auf st_list3 auf den Index haben.

Dies soll solange durchlaufen, bis alle elemte vom array auf 0 gesetzt werden.
VOrher sind garatiert alle werte >0.
Also muss, anchdem der Wert in st_list3 hinterlegt worden ist, im Array auf 0 gesetzt werden....


Hoffe es war etwas verständlich;
wenn wer wissen möchte wie der Quellcode aussieht.
Es gibt noch keine Ansätze für diesen Algorythmus - diesen werden ich morgen schreiben, wolt mir aber von euch schoneinmal ein paar Ideen holen

Programm; Wörterzählen.
Momemtaner stand;
Wörter werden auf ener tstringliste gespeichert;
Wie oft dieses Wort vorkommt auf eine Array.
Wort und wert haben den gleichen Index, deshlab leg ich soviel wert drauf, das die indexe nicht gelöscht werden sondern nur auf 0 gesetztn werden.



Hoffe ihr könnt ein paar Tipps, anregungen etc hinterlassen.
Dank im Vorraus
MfG

Mikkey 24. Sep 2013 16:17

AW: Sortierung;
 
Ich würde so etwas immer mit Klassen machen, die String und Anzahl enthalten.
Die packst Du in ein Array, das Du dann problemlos sortieren kannst.

Wenn Du unbedingt bei dem bisherigen Ansatz bleiben willst, erzeugst Du ein weiteres Array, in dem die Indices auf deine Stringlist und Array sortiert werden.

Der Zugriff geht dann per

Delphi-Quellcode:
stringList[sortArray[ii]]
bzw.
anzahlArray[sortArray[ii]]
Dabei ist ii eine passende Laufvariable.

DeddyH 24. Sep 2013 16:20

AW: Sorterung;
 
Wenn 2 Listen mit identischen Indizes verwendet werden sollen, riecht das für mich nach fehlerträchtigem Code. Daher sollte man das Konzept ggf. noch einmal überdenken.

Bjoerk 24. Sep 2013 16:56

AW: Sorterung;
 
Wenn du nicht die Objects der Stringlist nutzen willst (der Thread von vorhin, das warst du doch oder?) kannst du dir auch eine eigene Liste schreiben.

Zu Übungszwecken kann man das schön mit dyn. Arrays machen.

Delphi-Quellcode:
  TWord = record
    Value: string;
    KommtWieOftVor: integer;
    UndSonstNochWas: integer;
  end;

  TWordList = class
  private
    FItems: array of TWord;
  private
    function Get(Index: integer): TWord;
    procedure Put(Index: integer; const Value: TWord);
  public
    function Add(const Value: TWord): integer;
    procedure Insert(const Index: integer; const Value: TWord);
    procedure Delete(const Index: integer);
    function IndexOf(const Value: TWord): integer;
    procedure Assign(Value: TWordList);
    procedure Sort;
    property Items[Index: integer]: TWord read Get write Put; default;
  end;

Mokus 26. Sep 2013 07:31

AW: Sorterung;
 
Danke für die netten Hilfen;

meine sortierungsklasse ist nun so aufgebaut worden.

Delphi-Quellcode:
unit sortieren;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, hauefigkeit_zaehlen;

Type
  TForm3 = class
    procedure sortieren(a_zaehlen: array of integer; st_list2: TStringlist);
  end;

var
  s_ausgabe: string;

implementation

procedure TForm3.sortieren(a_zaehlen: Array of integer; st_list2: TStringlist);
var
  i: integer;
  x: integer;
  a: integer;
  i_hwert: integer;
  st_list3: TStringlist;
  i_hidx: integer;
  b_abbruch: boolean;

  st_list4: TStringlist;

begin

  // Listen erzeugen, wo ergibnisse abgespeichert werden
  st_list4 := TStringlist.Create;
  st_list3 := TStringlist.Create;

  // nach dem hösten wert im arra a_zaehlen suchen
  for x := 0 to length(a_zaehlen) do

  begin
    i_hidx := 0;
    i_hwert := 0;
    for a := 0 to length(a_zaehlen) - 1 do
    begin
      if i_hwert < a_zaehlen[a] then

      begin
        i_hwert := a_zaehlen[a];
        i_hidx := a;

      end;

    end;

    // Hösten wert + dazugehörige wort in listen übergeben
    st_list3.add(st_list2[i_hidx]);

    st_list4.add(inttostr(i_hwert));

    a_zaehlen[i_hidx] := 0; // momentan höhsten wert zurücksetzen

  end;
  // ausgabe für memofeld
  for i := 0 to st_list2.Count - 1 do
  begin
    s_ausgabe := s_ausgabe + #10#13 + 'Ihr Wort : "' + st_list3[i] + '" kam ' +
      st_list4[i] + ' mal vor.' + slinebreak;
  end;

  st_list3.free;

end;

end.
Ich weiß, ist nicht der schnellste Algorithmus, aber für das kleine Programm reicht das vollkommen aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 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