Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Array durch Objectlist ersetzen (https://www.delphipraxis.net/176919-array-durch-objectlist-ersetzen.html)

Dyami 4. Okt 2013 07:14

Delphi-Version: XE2

Array durch Objectlist ersetzen
 
Hallo,

ich stehe vor einem Problem. Ich habe die Aufgabe bekommen mein Array durch eine TObjectlist zu ersetzten. Nun habe ich mich ein bisschen damit beschäftigt und viel im Inet gelesen, aber ich habe immer noch keinen Plan was ich machen soll.

Delphi-Quellcode:
unit Woerter;

interface

uses

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

type

  TWoerterZaehlen = class(TObjectlist)
    // Wort: String;
    // Anzahl: integer;

  protected
    Fwort: string;
    Fanzahl: integer;
  public type

    ArrofTWoerterZaehlen = array of TWoerterZaehlen;
  function HaeufigkeitDerWorte2(st_w1: tstringlist): ArrofTWoerterZaehlen;
  constructor create(Anz: integer; Wor: String); overload;
  constructor create(Wor: String); overload;
  property Wort: String read Fwort write Fwort;
  property Anzahl: integer read Fanzahl write Fanzahl;

  function toString(arrofsort: TWoerterZaehlen.ArrofTWoerterZaehlen): String;
  end;

implementation

function TWoerterZaehlen.HaeufigkeitDerWorte2(st_w1: tstringlist)
  : TWoerterZaehlen.ArrofTWoerterZaehlen;

var
  i: integer;
  a: integer;
  s_wort: string;
  b_iv: boolean;
  index: integer;
Begin

  setlength(result, 0);
  index := 0;
  for i := 0 to st_w1.count - 1 do
  begin
    b_iv := false;
    s_wort := AnsiLowerCase(st_w1[i]);
    for a := 0 to length(result) - 1 do
    begin
      if result[a].Fwort = s_wort then
      begin
        b_iv := true;
        index := a;
        break;
      end;
    end;
    if b_iv then
    begin
      result[index].Fanzahl := result[index].Fanzahl + 1;
    end
    else
    begin
      setlength(result, length(result) + 1);
      result[high(result)] := TWoerterZaehlen.create(s_wort);
    end;
  end;
end;
{ TWoerterZaehlen }

constructor TWoerterZaehlen.create(Anz: integer; Wor: string);
begin
  Anzahl := Anz;
  Wort := Wor;
end;

constructor TWoerterZaehlen.create(Wor: String);
begin
  Anzahl := 1;
  Wort := Wor;
end;

function TWoerterZaehlen.toString(arrofsort: ArrofTWoerterZaehlen): String;
begin
  result := '';

end;

end.
Wäre echt nett, wenn Ihr mir helfen könntet. Sitze an dieser Aufgabe nämlich nicht alleine fest :/

Gruß

Philipp

Lemmy 4. Okt 2013 07:55

AW: Array durch Objectlist ersetzen
 
Hallo,

Zitat:

Zitat von Dyami (Beitrag 1230788)
Nun habe ich mich ein bisschen damit beschäftigt und viel im Inet gelesen, aber ich habe immer noch keinen Plan was ich machen soll.

was genau ist an

Zitat:

Zitat von Dyami (Beitrag 1230788)
Ich habe die Aufgabe bekommen mein Array durch eine TObjectlist zu ersetzten.

nicht klar? Ersetze ein Array durch eine ObjectList. Also alle VOrkommen eines Arrays suchen, markieren und ersetzen.

Und Vorbeugend auf deine weiteren Fragen: Ist der von dir gepostete Quelltext das Original oder von dir schon bearbeitet?

Grüße

DeddyH 4. Okt 2013 08:16

AW: Array durch Objectlist ersetzen
 
WoerterZahlen ist schon eine TObjectlist, die ein Array enthält, das zu einer TObjectlist umgeschrieben werden soll? Der Sinn erschließt sich mir gerade nicht so recht :gruebel:

Dyami 4. Okt 2013 08:17

AW: Array durch Objectlist ersetzen
 
Ok. Werde ich dann machen, danke.

Das ist der original Quelltext und ich habe bei der Klasse schon leicht angefangen, aber dann wusste ich nicht mehr weiter.. :/

Delphi-Quellcode:
type

  TWoerterZaehlen = class(TObjectlist)
    // Wort: String;
    // Anzahl: integer;
Dort habe ich schon TObjectlist eingetrage. Sorry, habe ich vergessen zu sagen

DeddyH 4. Okt 2013 08:22

AW: Array durch Objectlist ersetzen
 
Nehmen wir mal an, die Ursprungsklasse sah etwa so aus:
Delphi-Quellcode:
type
  TDings = class
  private
    FSubObjects: array of TDings;
    ...
  end;
Dann muss man doch "nur" das Array durch die geforderte TObjectlist ersetzen.
Delphi-Quellcode:
type
  TDings = class
  private
    FSubObjects: TObjectlist;
    ...
  end;
Allerdings darf man nicht vergessen, diese Instanz nun auch zu erzeugen (z.B. im Konstruktor) und später wieder freizugeben (z.B. im Destruktor).

[edit] Außerdem fallen SetLength()- und ähnliche Aufrufe weg, dafür muss man nun die Methoden der TObjectlist benutzen (Add etc.). [/edit]

Mokus 8. Okt 2013 07:25

AW: Array durch Objectlist ersetzen
 
Hey;
Arbeite an der gleichen Aufgabe wie Dyami;

problem ist bei unserem Quell text, ist die Kontrolle, ob ein string in der Tobjectlist vorhanden ist.
per
Delphi-Quellcode:
result.IndexOf () // result =  Twoerterzaehlen = class(TObjectlist)
kommt ne Meldung; inkompatible Typen.
Klar, String und Tobject. aber wie könnte man dieses Problem lösen ?

zu erst war die idee jedesmal .create
versucht mal ein index zurück zugeben, wenn der im Speicher immer wieder eine neue Position bekommt ...
die If abfrage würde also nie im Fall treten.
Was wollen wir den überhaupt erreichen ?
Wir haben
ein Memo.text ->
wird als commatext in eine Stringlist übergeben ->
diese Stringlist wird an die Methode übergeben ->
Durlaufen mit verschachtelter FOR schleife die Liste ->
möchten KOntrollieren ob der String in der TObjectlist vorhanden ist ->

WENN JA
Zähle den INDEX ein Hoch

WENN NEIN
Füge das WOrt hinzu & Zähle die Häufigkeit der Wörter ein hoch.

so .... wie kann man solches am besten anstellen ?!



Delphi-Quellcode:
  i_idx := 0;
  result := Twoerterzaehlen.created(0, ''); // *^1 
  // Durchlaufen der Wortlist
  for i := 0 to st_woerter.count - 1 do
  begin
    b_vorhanden := false;
    s_ewort := AnsiLowerCase(st_woerter[i]);
    // Prüfen, ob Wort da
    for a := 0 to result.count - 1 do
    begin
      if result.Items[a] = s_ewort then            // falsch
      begin
        i_idx := result.IndexOf((Twoerterzaehlen.create(s_ewort))); // geändert werden
        b_vorhanden := TRUE;
        break;
      end;
    end;
    // wenn ja, dann hochzählen
    if b_vorhanden then
    begin
      // inc(result[i_idx]);
    end
    else
    // Sonst ergänzen
    begin
      result.Add(Twoerterzaehlen.created(1, s_ewort));
    end;
  end;
end;
Delphi-Quellcode:
// *^1 
constructor Twoerterzaehlen.created(Anz: integer; Wor: String);
begin
  Anzahl := Anz;
  Wort := Wor;
end;

Siehe oben; methode zur Häufigkeit der Wörter wieder geben.

bei weitere Fragen bitte melden ;

Danke für jede kleine Hilfe ....

DeddyH 8. Okt 2013 07:36

AW: Array durch Objectlist ersetzen
 
Da schreibt man sich flugs eine einfache billige Methode/Routine und ruft die auf.
Delphi-Quellcode:
function IndexOfString(List: TObjectList; const SearchStr: string): integer;
var
  i: integer;
  Obj: TDeinObject;
begin
  Result := -1;
  for i := 0 to List.Count - 1 do
    begin
      Obj := List[i] as TDeinObject;
      if Obj.Stringfeld = SearchStr then
        begin
          Result := i;
          break;
        end;
    end;
end;
Die List wird sequentiell durchlaufen und die enthaltenen Objekte daraufhin untersucht, ob deren Stringfeld mit dem Suchstring übereinstimmt. Wenn ja, wird der Index des ersten passenden Objekts zurückgegeben und die Schleife abgebrochen. Entspricht kein Objekt den Kriterien, ist der Rückgabewert -1 (am Anfang der Funktion festgelegt).

Mokus 8. Okt 2013 08:18

AW: Array durch Objectlist ersetzen
 
Scheint eine SEHR doofe Frage sein;
aber :
Zitat:

Delphi-Quellcode:
  Obj: TDeinObject;

mein string; wie kan ich diesen nun als Object, als TOblictlist speichern ... ?

Delphi-Quellcode:
s_ewort := AnsiLowerCase(st_woerter[i]) as Twoerterzaehlen;
ansilower, damit er groß klein ignoriert;
und as Twoerterzaehlen : Class;

reicht ihm das nicht als Object zu speichern ?


vielleicht merk man dass ich noch nieee im Tobjectlist gearbeitet habe.
sry :<

DeddyH 8. Okt 2013 08:34

AW: Array durch Objectlist ersetzen
 
Du hast doch eine TObjectList. Diese enthält Objekte von einem bestimmten Typ, den ich nicht kenne, daher habe ich die Klasse im Beispiel einfach TDeinObject genannt. Dieses Objekt enthält ja nach Deiner Aussage auch eine Eigenschaft vom Typ String, die es zu untersuchen gilt. Das heißt im Beispiel dann eben Stringfeld. Nach Ersetzung dieser meiner Platzhalter sollte das ganze im Wesentlichen schon funktionieren. Statt AnsiLowercase kannst Du übrigens auch die Unit StrUtils einbinden und dann mit AnsiSameText vergleichen.

Mokus 8. Okt 2013 09:35

AW: Array durch Objectlist ersetzen
 
achsö;

alles klar, habs.
Dank dir =)


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