AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Anzahl verschiedener Werte im Array ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl verschiedener Werte im Array ermitteln

Ein Thema von Tim-94 · begonnen am 18. Jun 2013 · letzter Beitrag vom 20. Jun 2013
Antwort Antwort
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
132 Beiträge
 
Delphi 10.3 Rio
 
#1

Anzahl verschiedener Werte im Array ermitteln

  Alt 18. Jun 2013, 22:23
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
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.633 Beiträge
 
Delphi 12 Athens
 
#2

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 18. Jun 2013, 22:46
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.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
132 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 18. Jun 2013, 22:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#4

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 18. Jun 2013, 23:22
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (18. Jun 2013 um 23:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
132 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 19. Jun 2013, 06:57
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.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 19. Jun 2013, 08:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von Tim-94
Tim-94

Registriert seit: 3. Jul 2008
Ort: Hamburg
132 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 19. Jun 2013, 10:54
Vielen Dank für eure Hilfe, es funktioniert
...und wie schon anfangs vermutet ist das Ganze auch ziemlich simpel strukturiert.
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#8

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 19. Jun 2013, 17:23
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 Break; hinter das Result := False; Grüße!
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 19. Jun 2013, 19:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#10

AW: Anzahl verschiedener Werte im Array ermitteln

  Alt 20. Jun 2013, 10:31
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (20. Jun 2013 um 11:58 Uhr)
  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 21:16 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