AGB  ·  Datenschutz  ·  Impressum  







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

Array durch Objectlist ersetzen

Ein Thema von Dyami · begonnen am 4. Okt 2013 · letzter Beitrag vom 8. Okt 2013
Antwort Antwort
Benutzerbild von Dyami
Dyami

Registriert seit: 24. Sep 2013
Ort: Schleswig-Holstein
25 Beiträge
 
Delphi 10.3 Rio
 
#1

Array durch Objectlist ersetzen

  Alt 4. Okt 2013, 07:14
Delphi-Version: XE2
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
Philipp

Geändert von Dyami ( 4. Okt 2013 um 07:21 Uhr)
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.366 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Array durch Objectlist ersetzen

  Alt 4. Okt 2013, 07:55
Hallo,

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

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Array durch Objectlist ersetzen

  Alt 4. Okt 2013, 08:16
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
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 Dyami
Dyami

Registriert seit: 24. Sep 2013
Ort: Schleswig-Holstein
25 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Array durch Objectlist ersetzen

  Alt 4. Okt 2013, 08:17
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
Philipp
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Array durch Objectlist ersetzen

  Alt 4. Okt 2013, 08:22
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]
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 Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Array durch Objectlist ersetzen

  Alt 8. Okt 2013, 07:25
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 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 ....
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !

Geändert von Mokus ( 8. Okt 2013 um 07:27 Uhr) Grund: Reichtschreibfehler ? KANNST BEHALTEN ?!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Array durch Objectlist ersetzen

  Alt 8. Okt 2013, 07:36
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).
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 Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Array durch Objectlist ersetzen

  Alt 8. Okt 2013, 08:18
Scheint eine SEHR doofe Frage sein;
aber :
Zitat:
  Obj: TDeinObject;
mein string; wie kan ich diesen nun als Object, als TOblictlist speichern ... ?

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 :<
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Array durch Objectlist ersetzen

  Alt 8. Okt 2013, 08:34
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.
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 Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Array durch Objectlist ersetzen

  Alt 8. Okt 2013, 09:35
achsö;

alles klar, habs.
Dank dir =)
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:20 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