Ich schreibe ein Programm, das das Vorkommen von Integern zählt, die in ein Array eingegeben werden, zB wenn Sie 1 1 1 1 2 1 3 5 2 3 eingegeben haben, würde das Programm die eindeutigen Zahlen, gefolgt von ihren Vorkommen, wie folgt ausdrucken :
1 tritt 5 mal auf, 2 tritt 2 mal auf, 3 tritt 2 mal auf, 5 tritt 1 Mal auf
Und es ist fast fertig, abgesehen von einem Problem, das ich nicht herausfinden kann:
%Vor%Das Problem, das ich habe ist, dass, egal was der aktuelle Wert für 'num' ist, 'count' nur 1 ausgibt, und das Problem ist nicht in der Methode, die die Vorkommen zählt, denn wenn Sie Zahlen eingeben An der Stelle der Variablen ändert sich der Wert.
Gibt es eine Möglichkeit, dass ich das ändern kann, damit es die Vorkommen richtig ausdruckt, oder sollte ich etwas anderes versuchen? Und je einfacher die Lösung, desto besser, da ich Single-Dimension-Arrays noch nicht überwunden habe.
Danke für die Hilfe!
Was ich sagen muss ist, dass ich eine Weile gebraucht habe, um herauszufinden, wofür die beiden Variablen count
und countNum
stehen, vielleicht sind einige Kommentare nötig. Aber schließlich finde ich den Fehler heraus.
Nehmen wir an, die Eingabe zehn Zahlen sind: 5, 6, 7, 8, 5, 6, 7, 8, 5, 6
Nach der Sortierung ist numList
: 5, 5, 5, 6, 6, 6, 7, 7, 8, 8
Das von count
zurückgegebene Array occurrences()
sollte sein: [1, 2, 3, 1, 2, 3, 1, 2, 1, 2]
Tatsächlich sind die einzigen nützlichen Zahlen in diesem Ergebnis-Array:
%Vor% Die anderen Zahlen, wie die ersten beiden Zahlen 1, 2
vor 3
, werden nur dazu verwendet, die Summe der Vorkommen inkrementell zu berechnen, oder? Daher sollte Ihre Schleifenlogik wie folgt geändert werden:
Entfernen Sie den ersten if
-Code-Block:
Ändern Sie die zweite Bedingung if
in:
Danach sollte Ihr Code wie erwartet funktionieren.
Übrigens, Sie müssen es wirklich nicht so kompliziert machen. Probieren Sie HashMap
:)
Versuchen Sie HashMap. Für diese Art von Problem Hashes ist sehr effizient und schnell.
Ich schreibe diese Funktion, die Array übernimmt und eine HashMap zurückgibt, deren Schlüssel die Nummer und der Wert die Nummer ist.
%Vor%Jetzt iterieren Sie hashmap und drucken Sie das Auftreten von Zahlen wie folgt:
%Vor%Ausgabe:
Ich würde eine Tasche verwenden, eine Sammlung, die zählt, wie oft ein Element in der Sammlung angezeigt wird. Apache Commons hat eine Implementierung davon. Hier ist ihre Schnittstelle , und hier ist's eine Sortierte Baum-Implementierung .
Sie würden so etwas tun:
%Vor% Das obige Beispiel nimmt Elemente aus Ihrem numList
-Array und fügt sie dem Bag
hinzu, um die Anzahl zu berechnen, aber Sie brauchen das Array nicht einmal. Fügen Sie einfach die Elemente direkt zu Bag
hinzu. Etwas wie:
Sie könnten damit beginnen, ein Array von Werten zwischen MIN und MAX zu initialisieren. Dann können Sie jedem Element des Arrays hinzufügen, wenn dieser Wert auftritt 1 . Etwas wie,
%Vor% 1 Siehe auch radix sort counting sort .