Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Anzahl verschiedener Werte im Array ermitteln (https://www.delphipraxis.net/175399-anzahl-verschiedener-werte-im-array-ermitteln.html)

Tim-94 18. Jun 2013 21:23

Anzahl verschiedener Werte im Array ermitteln
 
Hey Leute,
Ich habe eine Frage bezüglich folgender Problemstellung...

Gesucht ist im Prinzip nur die Anzahl der unterschiedlichen Werte der einzelnen "Arrayplätze", dazu folgender Beispielcode:

Delphi-Quellcode:
const
  LOW = 1;
  HIGH = 5;
type
  TIndex = LOW..HIGH;
  TEingabe = array [TIndex] of String;
var
  Eingabe : TEingabe;
  I, J : TIndex;
  Count : Byte;

begin
Count := 0;

  for I:=LOW to HIGH do
    for J:=I to HIGH do
      if (Eingabe[I] <> Eingabe[J]) then
        {Eigentlich müsste jetzt die Count Variable um 1 erhöht werden, da ein "neuer" String vorhanden ist, allerdings nur dann, wenn dieser Wert nicht schon zuvor "gezählt" wurde...}

ShowMessage('Die Anzahl der versch. Eingaben ist: '+IntToStr(Count));
end;
Bei einer Belegung von...
Eingabe[1]:='A';
Eingabe[2]:='B';
Eingabe[3]:='B';
Eingabe[4]:='C';
Eingabe[5]:='A';
...soll die Count Variable am Ende den Wert 3 haben (eben den Wert der untersch. Eingaben im Array).

Sitze nun schon seit ein paar Tagen daran und komme einfach nicht weiter...habe einfach ein Brett vorm Kopf :|

Ich hoffe, dass mir jemand helfen kann. Schon einmal Danke im Voraus :)

zeras 18. Jun 2013 21:46

AW: Anzahl verschiedener Werte im Array ermitteln
 
Packe das doch alles in ein Stringlist und überprüfe, ob der Buchstabe schon drin ist mit IndexOf. Wenn nicht nicht enthalten, dann hinzufügen.
Das sollte eigentlich reichen.

Tim-94 18. Jun 2013 21:54

AW: Anzahl verschiedener Werte im Array ermitteln
 
Danke für deine schnelle Antwort zeras.
Leider "darf" ich keine Stringlist verwenden, sondern muss mit geschachtelten Schleifen und einfachen if-Bedingungen zurechtkommen... :/

Hast du trotzdem noch einen Tipp für mich?

Jonas Shinaniganz 18. Jun 2013 22:22

AW: Anzahl verschiedener Werte im Array ermitteln
 
Von Anwendungsentwickler zu Anwendungsentwickler...
Wie kannst du einem anderen Menschen eine sichere "Anleitung" zur Lösung deines Problemes geben.
Diese Anleitung ist dann dein Algorithmus.

Angenommen deine Strings stehen auf Karteikarten in einer langen Reihe auf deinem Schreibtisch. Stell dir folgende Fragen:

-Wo fängst du an, dir deine Karteikarten durchzulesen
-Schreibst du dir eventuell Zwischenwerte auf
-Wann ist die Aufgabe vollständig gelöst
-Wie kannst du effektiver sein

Wenn du die Aufgabe hättest, rauszufinden wie viele Unterschiedliche Karten da liegen, wie würdest DU es in der echten Welt machen?


Delphi-Quellcode:
// will ich mal nicht so sein...
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  function StringDasErsteMalAufgetreten(MomentanerString : String) : Boolean;

var
  Form1: TForm1;
  SchonDaGewesen : array of String;
  Eingabe : array [0..4] of String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
  Count : Integer;
begin
  Eingabe[0]:='A';
  Eingabe[1]:='B';
  Eingabe[2]:='B';
  Eingabe[3]:='C';
  Eingabe[4]:='A';

  count := 0;
  // gehe alle Strings durch
  for I := Low(Eingabe) to High(Eingabe) do
  begin
    // schaue ob String das erste mal auftritt
    if StringDasErsteMalAufgetreten(Eingabe[I]) then
    begin
      Inc(Count);
    end;
  end;

  ShowMessage(IntToStr(Count))

end;

function StringDasErsteMalAufgetreten(MomentanerString : String) : Boolean;
var
  I: Integer;
begin
  Result := True;

  for I := Low(SchonDaGewesen) to High(SchonDaGewesen) do
  begin
    if MomentanerString = SchonDaGewesen[I] then
    begin
      Result := False;
    end;
  end;

  // String evtl in die "Schondagewesen-Liste" aufnehmen
  if Result then
  begin
    SetLength(SchonDaGewesen, Length(SchonDaGewesen) + 1);
    SchonDaGewesen[High(SchonDaGewesen)] := MomentanerString;
  end;

end;

end.

Tim-94 19. Jun 2013 05:57

AW: Anzahl verschiedener Werte im Array ermitteln
 
Vielen Dank für deine Antwort, ich werde es nachher sofort ausprobieren :)

Ich weiß, dass es eigentlich nicht richtig ist, jemandem eine Frage zu stellen und dann den Lösungsweg bereits vorauszusetzen, jedoch war ich so verzweifelt :| , weil ich schon etliche Dinge ausprobiert habe und einfach geglaubt habe, dass dort irgendwo die richtige Lösung verborgen ist...

Trotzdem noch einmal vielen Dank.

Furtbichler 19. Jun 2013 07:58

AW: Anzahl verschiedener Werte im Array ermitteln
 
Also mit zwei Schleifen geht das so:
Delphi-Quellcode:
Var
  i,j : Integer;
  SchonVorhanden : Boolean;

begin
  AnzahlUnterschiedlicherWerte := 0;

  For i:=1 to AnzahlDerEingaben do begin
    SchonVorhanden := False;
    For j:=1 to i-1 do
      if Eingabe[i]=Eingabe[j] then SchonVorhanden := True;
    If not SchonVorhanden then inc(AnzahlUnterschiedlicherWerte);
  end;
end;
Optimieren kann man das noch, indem man die innere Schleife verlässt, sobald der Wert gefunden wurde. Hübscher wird das außerdem, wenn man die innere Schleife in eine kleine Funktion packt:

Delphi-Quellcode:
Var
  i : Integer;

  Function _SchonVorhanden (Wert : String) : Boolean;
  Var
    j : Integer;
  begin
    For j:=1 to i-1 do
      if Wert=Eingabe[j] then begin result := true: exit end;
    result := false
  end;

begin
  AnzahlUnterschiedlicherWerte := 0;
  For i:=1 to AnzahlDerEingaben do
    If not _SchonVorhanden(Eingabe[i]) then
      inc(AnzahlUnterschiedlicherWerte);
end;
So, und das ist jetzt schön lesbar.

Tim-94 19. Jun 2013 09:54

AW: Anzahl verschiedener Werte im Array ermitteln
 
Vielen Dank für eure Hilfe, es funktioniert :)
...und wie schon anfangs vermutet ist das Ganze auch ziemlich simpel strukturiert.

Jonas Shinaniganz 19. Jun 2013 16:23

AW: Anzahl verschiedener Werte im Array ermitteln
 
Zitat:

, wenn man die innere Schleife in eine kleine Funktion packt:
Habe ich gemacht...

Furtbichler, dein Algorithmus zählt Werte, welche 2 oder mehr mal im Array vorkommen garnicht...
Das dürfte gegen das Topic:
Zitat:

Anzahl verschiedener Werte im Array ermitteln
verstoßen.

Zitat:

Optimieren kann man das noch, indem man die innere Schleife verlässt...
Ja stimmt, einfach ein
Delphi-Quellcode:
Break;
hinter das
Delphi-Quellcode:
Result := False;
Grüße!

Furtbichler 19. Jun 2013 18:19

AW: Anzahl verschiedener Werte im Array ermitteln
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1219091)
Furtbichler, dein Algorithmus zählt Werte, welche 2 oder mehr mal im Array vorkommen garnicht...
Das dürfte gegen das Topic:
Zitat:

Anzahl verschiedener Werte im Array ermitteln
verstoßen.

Hab ich da etwas falsch verstanden? [1 1 1 2 2 3] => 3, weil es nur 3 unterschiedliche Werte gibt, nämlich 1,2 und 3. Ich habe es selbst nicht getestet, aber der Code sollte korrekt sein.

Hast Du ein Beispiel?

Jonas Shinaniganz 20. Jun 2013 09:31

AW: Anzahl verschiedener Werte im Array ermitteln
 
Zitat:

[1 1 1 2 2 3] => 3, weil es nur 3 unterschiedliche Werte gibt
Dann hast du es warscheinlich genauso wie ich aufgefasst.

Ich hab bis eben nur übersehen, dass du in deiner For-Schleife nicht alle Elemente durch gehst, sondern innerhalb der nested-function For-Schleif nur bis
Zitat:

i-1
zählst.

Dann fehlt nur ein kleines Semikolon bei
Zitat:

result := true:
da hast du ausversehen einen Doppelpunkt getippt.

Alles klar! Du schaust dir einfach der Reihe nach alle Elemente an, und schaust in der inneren Schleife, ob in den vorherigen Elementen schonmal das jetzige Element aus der äußeren Schleife vorhanden ist und brichst beim ersten Treffer ab.

Ist zwar ganz anders als mein Ansatz aber eventuell die bessere Lösung für sein Problem, da er so keinen Hilfsarray braucht.


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