Häufigkeit d. Auftritts eines Wertes im Array

  • Themenstarter Themenstarter Gast :D
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast :D

Gast
Guten Tag,
ich stehe for folgendem Problem: Ich habe ein (zunächst ungeordnetes) eindimensionales int-array (z. B. {0,5,2,2,3,2,4} ) und will testen, wie oft ein Wert (sagen wir 1) darin vorkommt (wäre in diesem Fall 0 mal^^). Ich habe mich schonmal in der java API umgesehen, aber leider keine passende Methode gefunden. Gestoßen bin ich nur auf Quicksort und BinarySearch-Methoden. Daraus kann ich mir natürlich prinzipiell meine gewünschte Methode zusammenbauen, aber was mir zur Zeit vorschwebt* ist extrem aufwändig und ressourcenverschwenderisch. Meine Frage: Gibt es eine elegantere Möglichkeit und wie könnte man da rangehen?

* Hier mein jetziger Ansatz (leider noch keinen Quelltext geschrieben):
1. die Liste mit Quicksort sortieren.
2. mit binarySearch den Wert suchen
3. bei gefundenem Wert von da an mit ner while-Schleife weitergehen solange der Wert von m==m[i-1] ist. auf diese weise die elemente zählen.

Vielen Dank für eure etwaigen Mühen
 
wenn es nur eine überschaubare menge an möglichenwerten ist, würde ich mir einfach ein array erstellen, was genauso groß ist wie die möglichen auftauchenden ints.
beispiel:
mögliche zahlen: 0-5
ein array erstellen mit den indiezes von 0-5 und mit 0 setzen.
dann dein array durchlaufen und immer für die gefundene zahl den wert im "muster"array erhöhen.

falls in deinem array alle int werte möglich sind würde ich von dieser methode abstand nehmen. Und eine HashMap empfehlen.
Dann solltest du dein array durchlaufen und die gefundene zahl als key setzen und einen "counter" als value, falls ein key schon existiert value abrufen und erhöhen...
 
Code:
int a[] = { 0, 5, 2, 2, 3, 2, 4 };
int x = 2; // gesuchte Zahl
int n = 0; // Anzahl Vorkommen der gesuchten Zahl
Arrays.sort(a);
int index = Arrays.binarySearch(a, x);
if(index >= 0) {
   for(int i=index; i<a.length && a[i]==x; i++) {
      n++;
   }
   for(int i=index-1; i >= 0 && a[i]==x; i--) {
      n++;
   }
}
System.out.println(n);
oder einfach unsortiert alle durchgehen (ist schneller).
Code:
for(int i=0; i<a.length; i++) {
   if(a[i] == x) {
      n++;
   }
}
 
@function: An deine erstgenannte Variante hatte ich tatsächlich auch gedacht, habe ich aber bereits verworfen, denn der Bereich der möglichen Werte könnte bei mir in der Tat größer werden. Was die HashMap angeht: Dazu fehlen mir bisher die Kenntnisse. Hast mich jetzt aber neugierig gemacht und ich werd mich mal mit befassen, danke dir.

@Gast: Danke! Deine zweite Variante ist genau das, was ich gebraucht habe. Jetzt wird mir klar, dass ich viel zu kompliziert gedacht habe und die Lösung ja eigentlich recht trivial war! Soweit ich das beurteilen kann scheint die Komplexität ja noch in nem angemessenen Rahmen zu sein. Also vielen Dank dafür, dass du mir die Denkblockade aufgelöst hast 😉
 
Gast :D hat gesagt.:
@Gast: Danke! Deine zweite Variante ist genau das, was ich gebraucht habe. Jetzt wird mir klar, dass ich viel zu kompliziert gedacht habe und die Lösung ja eigentlich recht trivial war! Soweit ich das beurteilen kann scheint die Komplexität ja noch in nem angemessenen Rahmen zu sein. Also vielen Dank dafür, dass du mir die Denkblockade aufgelöst hast 😉
Man nimmt immer die einfachste Variante, die die vorliegende Aufgabe (noch) erfüllt. 😉
 
Code:
int a[] = { 0, 5, 2, 2, 3, 2, 4 }; 
int x = 2; // gesuchte Zahl 
List<Integer> intList = Arrays.asList( ints ); 
System.out.println( Collections.frequency( intList, x ));
 
Code:
int a[] = { 0, 5, 2, 2, 3, 2, 4 };
int x = 2; // gesuchte Zahl
List<Integer> intList = Arrays.asList( a );
System.out.println( Collections.frequency( intList, x ));

da krieg ich nen compilefehler in zeile 3:
incompatible types
found : java.util.List<int[]>
required: java.util.List<java.lang.Integer>
List<Integer> intList = Arrays.asList( a );

Den Fehler verstehe ich nicht ganz. Kann mir den jemand erklären? ~Danke
 
schreibe statt int Integer:

Code:
Integer a[] = { 0, 5, 2, 2, 3, 2, 4 }; 
	 int x = 2; // gesuchte Zahl 
	 List<Integer> intList = Arrays.asList( a ); 
	 System.out.println( Collections.frequency( intList, x ));
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben