Arrays erstellen, Zahlen suchen

Hallo,
in meinem vorigen Beitrag habe ich bereits versucht ein Array zu erstellen, dessen Länge 20 beträgt und zufällig mit den Zahlen von 1-3 gefüllt wird.
das habe ich mit eurer Hilfe soweit hinbekommen.
Jetzt soll ich ermitteln wie oft die Zahlen 1-3 jeweils in dem Array vorkommen und diese Häufigkeit anschließend ausgeben.Dabei hakt’s ein wenig bei mir. Die Häufigkeit wird bei meinem Programm ausgegeben, jedoch stimmt sie nicht mit der reellen Häufigkeit überein und ich weiß leider nicht woran das liegen könnte.
Hier mein Programmcode:

import java.util.*;
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException{

int[] array = new int[20];
byte searchValue1 = 1;
byte searchValue2 = 2;
byte searchValue3 = 3;

final Random r = new Random();
for(int i=0;i

Hier auch nochmal:

Wieso suchst Du nach einem byte , wenn Du ein int[] hast?

Achso, und hier noch ein wichtiger Ausschnitt aus den Javadocs:

The array must be sorted (as by the sort(int[]) method) prior
to making this call. If it is not sorted, the results are undefined.

Hab ich gemacht, aber immer noch fehlerhaft:

import java.util.*;
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException{

int[] array = new int[20];
int searchValue1 = 1;
int searchValue2 = 2;
int searchValue3 = 3;

final Random r = new Random();
for(int i=0;i

Hallo

int zahl1 = Arrays.binarySearch(array, searchValue1);
int zahl2 = Arrays.binarySearch(array, searchValue2);
int zahl3 = Arrays.binarySearch(array, searchValue3);
System.out.println(„Die Zahl 1 kommt " + zahl1 + " mal
vor“);
System.out.println(„Die Zahl 2 kommt " + zahl2 + " mal
vor“);
System.out.println(„Die Zahl 3 kommt " + zahl3 + " mal
vor“);

binarySearch gibt dir auch nicht die Anzahl, wie oft diese Zahl im Array vorkommt, zurück sondern die Indexposition an der die Zahl gefunden wurde.

Grüße

Michael

Ahja, den Hinweis auf binarySearch hab ich ganz überlesen. Wenn man Javadocs zitiert, sollte man auch bis zum Ende lesen… :wink:

Da das ganze eine Übungsaufgabe ist, wirst Du wohl selbst zählen müssen. Und weil es wohl etwas zu früh ist, eine java.util.Map einzuführen, solltest Du einfach durch das Array marschieren und Dir in einer Zählervariable die Vorkommnisse Deiner searchValue* speichern.

for(int i:array) { 
 System.out.println(i);
 switch(i) {
 case searchValue1:
 findValue1++;
 break;
 case searchValue2:
 findValue2++;
 break;
 case searchValue3:
 findValue3++;
 break;
 default:
 System.err.println("Oops");
 break;
 }
}

Man kann das natürlich auch mit if/else machen, aber ich bin ein Freund von switch.

Und wie bau ich das in meinen schon vorhandenen Programmcode ein?
Ich hab das grade versucht und bekomme mehrere Fehlermeldungen.

Wie sieht dein Code denn bis jetzt aus?

Grüße

Michael

Und vor allem: Wie sehen Deine Fehlermeldungen aus?

Ohne solche Informationen kann man wenig sagen…

import java.util.*;
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException{

int[] array = new int[20];
int searchValue1 = 1;
int searchValue2 = 2;
int searchValue3 = 3;

final Random r = new Random();
for(int i=0;i

Ich bedenke erstmal das du anfänger bist, und sage dir diese fehlermeldung sagt dir genau was du nicht gemacht hast.

es sagt das ‚findValue‘ irgentwie nicht richtig ist.

allerdings find ich auch keine denefinition vorher.

bie

int searchValue1 = 1;
int searchValue2 = 2;
int searchValue3 = 3;

hast du das schon gemacht.

wiseo also nicht auch für findValue .

P.S.
Wenn einer Dir eine Lösung vorschlägt , ist es meist nur der syntax bzw logische aufbau des ablaufs der zur lösung führt. Das anpassen an deine Variablen und umgebebung ist dir überlassen.

An alle anderen die nur Copy&amp:stuck_out_tongue_winking_eye:ast wollen :
Denn wenn man es nicht macht, dann versteht der User nix und nutzt copy & paste und fragt wie gehts weiter.
So kann man dann irre lange grosse projekte durchfregen und solange alle mitmachen quasi fremdkonstruieren lassen. Nur bringt das dem Frager nichts. Und noch schlimmer , fertig Lösungen bedeuten auch, das leute die arbeit des fragers übernehmen müssen, wo er doch nur wissen wollte wie was gemacht wird :smile:
In der schule nennt man das transfer wissen , eine vorlage haben und das aufs eigene system übertragen .

Fazit : Ich erklär gerne wie man ein Haus baut, dennoch bau ich es keinem für Lau :smile:

der Teil

Arrays.sort(array);

und der Teil

int zahl1 = Arrays.binarySearch(array, searchValue1);
int zahl2 = Arrays.binarySearch(array, searchValue2);
int zahl3 = Arrays.binarySearch(array, searchValue3);

ist völlig überflüssig denn du willst ja nichts suchen oder sortieren sondern zählen.

Wie schon die Fehlermeldung sagt wird in diesem Teil hier

switch(i) {
case searchValue1:
findValue1++;
break;
case searchValue2:
findValue2++;
break;
case searchValue3:
findValue3++;
break;
default:
System.err.println(„Oops“);
break;
}
}

ein kostanter Ausdruck nach jedem case benötigt und keine Variable.
Also entweder du schreibst case 1: case 2: case 3: oder du schreibst oben final int searchValue = 1; usw.
Der zweite Teil der Fehlermeldung wurde ja von RakonDark schon erklärt.

System.out.println(„Die Zahl 1 kommt " + zahl1 + " mal
vor“);
System.out.println(„Die Zahl 2 kommt " + zahl2 + " mal
vor“);
System.out.println(„Die Zahl 3 kommt " + zahl3 + " mal
vor“);
}}

Wieso benutzt du jetzt hier wieder die Variablen zahl1, zahl2 und zahl3? Du hast doch oben findValue1, findValue2 und findValue3 zum zählen benutzt. Darin sind dann die Werte gespeichert, wie oft eine Zahl im Array vorkommt.

Außerdem würde ich dir dringend empfehlen, dich erstmal an leichteren Übungen zu versuchen. Wenn man noch nie programmiert hat und irgendwo in der Mitte anfängt zu lernen, tut man sich sehr schwer.

Schau dir doch mal das OpenBook von Galileo an:

http://openbook.galileocomputing.de/javainsel8/

Dort solltest du erstmal die Grundlagen nachlesen bevor du weitere Übungen mit Arrays anfängst.

Grüße

Michael

Also ich hab das jetzt in meinem Programm verbessert, aber es ist noch nicht ganz einwandfrei. Ich bekomme noch die Fehlermeldung ‚findValue1 might not have been initialized‘ obwohl ich dies oben gemacht habe.

import java.util.*;
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException{

int[] array = new int[20];
final int searchValue1 = 1;
final int searchValue2 = 2;
final int searchValue3 = 3;
int findValue1;
int findValue2;
int findValue3;

final Random r = new Random();
for(int i=0;i

P.S.
Wenn einer Dir eine Lösung vorschlägt , ist es meist nur der
syntax bzw logische aufbau des ablaufs der zur lösung führt.
Das anpassen an deine Variablen und umgebebung ist dir
überlassen.

Exakt. So sind meine Antworten auch gemeint. :smile:

Also ich hab das jetzt in meinem Programm verbessert, aber es
ist noch nicht ganz einwandfrei. Ich bekomme noch die
Fehlermeldung ‚findValue1 might not have been initialized‘
obwohl ich dies oben gemacht habe.

Ok, dann müssen wir wohl nochmal bei Kapitel 1 anfangen.

final int searchValue1 = 1;
final int searchValue2 = 2;
final int searchValue3 = 3;

Diese Variablen sind initialisiert.

int findValue1;
int findValue2;
int findValue3;

Diese Variablen sind nicht initialisiert.

Eine Anweisung Object a; zeigt zwar an, dass die Variable verwendet werden soll, sie hat aber noch keinen Wert zugewiesen bekommen (IIRC wird auch noch kein Speicher reserviert). Erst wenn mit a = new …; eine Zuweisung erfolgt, ist die Variable initialisiert und hat einen vorhersagbaren Zustand.

Ich hab die Variablen doch angepasst.

Kleiner Nachtrag:

http://java.sun.com/docs/books/jls/second_edition/ht…

Ok,und jetzt nochmal die aktuelle Ausgabe: %-)

http://java.sun.com/docs/books/jls/third_edition/htm…

Hier wäre auch der Source wieder hilfreich.

In Deinem letzten Sourcecode hattest Du die Variablen findValue1 - 3 nicht angelegt, nur searchValue1 - 3.

Ok jetzt hab ich’s, bloß wird das Array 2 mal hintereinander ausgegeben. Und den Teil nach der 2. for-Schleife verstehe ich nicht so ganz. Ich kenn die for-Schleife nur in der Schreibweise, wie es bei der ersten gemacht wurde, und die switch-case Anweisung ist mir auch unverständlich. Heißt dieses ‚findValue1++‘ dass der in dem Array eins vorgeht um die nächste 1 zu finden?
Hier ist nochmal der Programmcode:

import java.util.*;
import java.io.*;

public class Main {

public static void main(String[] args) throws IOException{

int[] array = new int[20];
final int searchValue1 = 1;
final int searchValue2 = 2;
final int searchValue3 = 3;
int findValue1 = 0;
int findValue2 = 0;
int findValue3 = 0;

final Random r = new Random();
for(int i=0;i