![]() |
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:
Bei einer Belegung von...
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; 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 :) |
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. |
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? |
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. |
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. |
AW: Anzahl verschiedener Werte im Array ermitteln
Also mit zwei Schleifen geht das so:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
So, und das ist jetzt schön lesbar.
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; |
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. |
AW: Anzahl verschiedener Werte im Array ermitteln
Zitat:
Furtbichler, dein Algorithmus zählt Werte, welche 2 oder mehr mal im Array vorkommen garnicht... Das dürfte gegen das Topic: Zitat:
Zitat:
Delphi-Quellcode:
hinter das
Break;
Delphi-Quellcode:
Grüße!
Result := False;
|
AW: Anzahl verschiedener Werte im Array ermitteln
Zitat:
Hast Du ein Beispiel? |
AW: Anzahl verschiedener Werte im Array ermitteln
Zitat:
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:
Dann fehlt nur ein kleines Semikolon bei Zitat:
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 10:43 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 by Thomas Breitkreuz