# Array - die Häufigkeit der Zahl zählen



## Berlin_er (21. Mrz 2018)

Hallo Leute,
ich habe gerade eine Aufgabe vor mir liegen, bei dem der Benutzer per Eingabe entscheidet, wie viele Zahlen ins Array sollen.
Dann soll mein Programm zählen, wie oft eine bzw. dieselbe Ziffer/Zahl im Array vorkommt.
Zum Schluss soll die Zahl und die Häufigkeit/Menge ausgegeben werden.
Ich habe das Ganze mit einem mehrdimensionalen Array/ for-Schleifen und If-Abfragen gemacht. Fast alles klappt perfekt. 

Mein Problem ist, dass wenn eine Ziffer/Zahl mehrmals vorkommt, die Ausgabe dann auch genauso oft die Zahl mit der Menge ausgibt. Bei der Ausgabe soll eine Ziffer/Zahl nur einmal vorkommen.

Vorab vielen Dank!


Mein Code:


```
public class HaeufigkeitArray {
  public static void main (String args []){
   
    int anzahl = InOut.readInt("Wie viele Zahlen? ");
   
    int [][] zahl = new int [anzahl][anzahl];
   
    System.out.println();
    for (int i = 0;i < anzahl ;i++) {
      zahl [0][i] = InOut.readInt((i+1)+".Zahl -> ");
    } // end of for
   
    for (int j = 0;j < anzahl ;j++ ) {
      int menge = 0;
      for (int k = 0;k < anzahl ;k++ ) {
        if (zahl [0][j] == zahl [0][k]) {
          menge += 1;
        } // end of if
      } // end of for
      zahl [1][j] = menge;
    } // end of for
   
    System.out.println();
    for (int l = 0;l < anzahl ;l++ ) {
      System.out.println("Zahl: "+zahl[0][l]+", Menge: "+zahl[1][l]);
    } // end of for
   
   
  }
}
```


----------



## Robat (21. Mrz 2018)

Dein Problem ist momentan das du beim Zählen nicht prüfst ob du die selbe Zahl vorher schon mal gezählt hast.
Du zählst also Zahlen die mehrmals vorkommen auch mehrmals.


----------



## Berlin_er (21. Mrz 2018)

Edit: Bitte keine extra Klas


Robat hat gesagt.:


> Dein Problem ist momentan das du beim Zählen nicht prüfst ob du die selbe Zahl vorher schon mal gezählt hast.
> Du zählst also Zahlen die mehrmals vorkommen auch mehrmals.



ALso, ich kam auf die Idee eine verschachtelte Schleife zu erstellen, um die Werte im Array miteinander zu vergleichen.
Ich dachte mir, dass ich die mehrmals vorkommenden Zahlen mit einer if-Abfrage dann in der Schleife auf 0 setze, sodass am Ende nurnoch einer der Zahlen übrig bleibt. Aber dann dachte ich, wenn der Benutzer am Anfang eine 0 eingeben würde, dann würde das Ganze schief gehen. 
Gibt es vielleicht eine Möglichkeit, die Werte aus einem Array zu "löschen", statt sie auf 0 zu setzen?
Somit könnte ich die Werte löschen, die doppelt vorkommen (natürlich nach dem zählen) und die Werte im Array sozusagen "vorrücken".
Mir ist nur bekannt, dass es mit ArrayList funktionieren soll (laut Internet), doch gibt es eine Möglichkeit ohne "Extras"?


----------



## Robat (21. Mrz 2018)

Geht schon .. wäre nur recht Aufwendig für den Usecase (zmd für meinen Geschmack.)
Du könntest die Werte doch auf eine negative Zahl setzen um zu wissen, dass du sie bereits gezählt hast ..


----------



## Berlin_er (21. Mrz 2018)

Hoffe du bist noch da 
Also, ich habe jetzt 2 weitere Arrays erstellt + 1 Schleife.
Meinst du mit: "Geht schon .. wäre nur recht Aufwendig für den Usecase (zmd für meinen Geschmack.)" sowas? 


```
public class HaeufigkeitArray {
  public static void main (String args []){
   
    int anzahl = InOut.readInt("Wie viele Zahlen? ");
   
    int [][] zahl = new int [anzahl][anzahl];
    int [][] zahl2 = new int [anzahl][anzahl];
    int [][] ausgabe = new int [anzahl][anzahl];
   
    System.out.println();
    for (int i = 0;i < anzahl ;i++) {
      zahl [0][i] = InOut.readInt((i+1)+".Zahl -> ");
      zahl2 [0][i] = zahl[0][i];
    } // end of for
   
    for (int j = 0;j < anzahl ;j++ ) {
      int menge = 0;
      for (int k = 0;k < anzahl ;k++ ) {
        if (zahl [0][j] == zahl [0][k]) {
          menge += 1;
        } // end of if
      } // end of for
      zahl [1][j] = menge;
      zahl2 [1][j] = menge;
    } // end of for
   
    for (int m = 0;m < anzahl ;m++ ) {
      for (int n = 0;n < anzahl ;n++ ) {
        if (zahl[0][m] == zahl2[0][n] && zahl[1][m] == zahl2[1][n]) {
          ausgabe[0][m] = zahl[0][m];
          ausgabe[1][m] = zahl[1][m];
          zahl2[0][n] = 0;
          zahl2[1][n] = 0;
        } // end of if
      } // end of for
    } // end of for
   
    System.out.println();
    for (int l = 0;l < anzahl ;l++ ) {
      if (ausgabe[1][l] != 0) {
        System.out.println("Zahl: "+ausgabe[0][l]+", Menge: "+ausgabe[1][l]);
      } // end of if
    } // end of for
   
   
  }
}
```


----------



## MoxxiManagarm (21. Mrz 2018)

Ich verstehe den ganzen Zweck von dem mehrdimensionalen Array nicht. Das scheint mir persönlich sehr aufwendig (und unleserlich/unverständlich). Du gibst die Zahlen letztendlich doch nur in einem eindimensionalen Array ein. Wenn ich vor dieser Aufgabe stünde würde ich die Eingabe eindimensional machen und die gezählten Zahlen in einer Map speichern. Key der Map ist dann die zu zählende Zahl, Value ist die Häufigkeit der Zahl. Dann kannst du schreiben

"Für jedes Element im Array, hole den aktuellen Zählwert aus der Map und inkremetiere diesen. Falls die Zahl in der Map noch nicht existiert, füge die Zahl mit der Häufigkeit 1 hinzu."

Anschließend kannst du alle Key/Value Paare ausgeben.


----------



## Robat (21. Mrz 2018)

Das "geht schon .. " bezog sich eher auf den Aspekt ein Array zu vergrößern / zu verkleinern und Werte aufzurücken.

@MoxxiManagarm nur ist es meist so das bei solchen Aufgaben Maps noch keine Rolle gespielt haben und es vermutlich ohne gelöst werden soll.


----------



## Berlin_er (21. Mrz 2018)

MoxxiManagarm hat gesagt.:


> Ich verstehe den ganzen Zweck von dem mehrdimensionalen Array nicht. Das scheint mir persönlich sehr aufwendig (und unleserlich/unverständlich). Du gibst die Zahlen letztendlich doch nur in einem eindimensionalen Array ein. Wenn ich vor dieser Aufgabe stünde würde ich die Eingabe eindimensional machen und die gezählten Zahlen in einer Map speichern. Key der Map ist dann die zu zählende Zahl, Value ist die Häufigkeit der Zahl. Dann kannst du schreiben
> 
> "Für jedes Element im Array, hole den aktuellen Zählwert aus der Map und inkremetiere diesen. Falls die Zahl in der Map noch nicht existiert, füge die Zahl mit der Häufigkeit 1 hinzu."
> 
> Anschließend kannst du alle Key/Value Paare ausgeben.



Ja,ich finde es auch nicht schön, aber wir haben in der Schule bis Array "gelernt"(bis jetzt) und sollen die Aufgaben mit dem Stoff lösen, was wir bis jetzt im Unterricht hatten. Maps hatten wir noch nicht, ArrayList genauso wenig. Dürfte ich was anderes benutzen, dann würde Google für mich sofort eine Antwort haben und ich würde dann auch kein "Nudelsalat" erstellen. Außerdem habe ich die mehrdimensionalen erstellt, weil mein Programm sonst noch voller wäre.

Aber trotzdem danke für die Ideen und für deine Hilfe Robat!


----------



## MoxxiManagarm (21. Mrz 2018)

Achja immer der Lehrstoff. Aber dann würde ich ein 2 mal n großes Array machen (nicht n mal n) und so die Wertepaare abbilden.

Du hättest dann eingabeArray[anzahl] und zählArray[anzahl][2] wobei zählArray[n][0] die Zahl und zählArray[n][1] die Anzahl ist. Das ZählArray wäre nur "voll" wenn keine Zahl doppelt vorkommt und hat entsprechend viele nullpaare.


----------



## MoxxiManagarm (21. Mrz 2018)

PS.: natürlich würde diese Variante voraussetzen, dass im Eingabearray keine 0 ist


----------

