Vorkommen von ganzen Zahlen in einem Array zählen [duplizieren]

8

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!

    
Len 01.11.2015, 04:46
quelle

5 Antworten

1

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:

  1. Entfernen Sie den ersten if -Code-Block:

    %Vor%
  2. Ändern Sie die zweite Bedingung if in:

    %Vor%

Danach sollte Ihr Code wie erwartet funktionieren.

Übrigens, Sie müssen es wirklich nicht so kompliziert machen. Probieren Sie HashMap :)

    
JasonZhao 01.11.2015, 06:29
quelle
3

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:

    
Irfan 01.11.2015 05:10
quelle
2

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:

%Vor%     
Andre Gregori 01.11.2015 05:51
quelle
1

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 .

    
Elliott Frisch 01.11.2015 05:04
quelle
0

Ich denke, Sie können Ihren Code sehr vereinfachen, wenn Sie diesen Ansatz verwenden. Sie müssen noch ändern, um die MAX_NUM und MAX_VALUE einzufügen.

%Vor%     
Alexander 01.11.2015 05:45
quelle

Tags und Links