Hallo,
ich will folgendes umsetzen:
Ich will Zahlen in ein Feld speichern und anstatt eine bereits vorhande Zahl mehrmals abzuspeichern, mit zu zählen, wie oft sie vorkommt:
Mein Programm soll 2 Werte per Kommandozeilenparamter enthalten.
Der erste gibt die Größe des Feldes an( Anzahl verschiedener Zahlen), der 2. Die Anzahl einzulesender Zahlen. Es können deutlich mehr Elemente eingelesen werden, als das Feld groß ist, allerdings soll garantiert sein, dass nur höchstens so viele verschiedene Zahlen vorkommen, wie im 1 . Kommandozeilenparamter angeben.
Es soll ausgegeben werden:
Alle Zahlen kommagetrennt und die Anzahl der Vorkommnisse aller Zahlen.
Wie realsiere ich das vor allem die Anzahl der Vorkomnisse aller Zahlen?
Du kannst ein zweidimensionales Array mit zwei Spalten und x Zeilen erstellen (alternativ würde natürlich auch eine HashMap gehen).
In der ersten Spalte speicherst du die Zahl und in der zweiten Spalte speicherst du eine 1. Wenn die Zahl später wieder genannt wird erhöhst du den Wert mithilfe von ++.
Mein Programm soll 2 Werte per Kommandozeilenparamter enthalten.
Der erste gibt die Größe des Feldes an( Anzahl verschiedener Zahlen), der 2. Die Anzahl einzulesender Zahlen.
Ich bin neu in Java und habe noch Probleme:
D.h ich habe in meinem String array an der Stelle 0 die Größe des Feldes stehen.
D.h ich lege ein Array an:int zahlenfeld [] = new zahlenfeld[args[0]];
Das funktioniert leider nicht. Wie kriege ich das hin, das mein Array die Länge netsprechend dem Kommandozeilenparameter hat?
Es muss nach jeder Benutzereingabe überprüft werden.
Dazu kannst du eine Hilfsvariable verwenden, die du (immer wenn eine "neue" Zahl eingegeben worden ist) um 1 erhöhst und dann mit args[0] vergleichst.
Um deine Frage komplett beantworten zu können muss ich wissen für welches Konzept du dich entschieden hast.
import java.io.*;
public class Testklasse {
public static void main( String[] args) {
int zahlenfeld[] = new int [Integer.parseInt(args[0])];
int anzahl = Integer.parseInt(args[1]);
BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Werte eingeben:")
int [] Werte = new int[anzahl];
for(int i=0; i<anzahl; i++) {
Werte[i]= Integer.parseInt(ein.readLine());
}
}
}
Es muss nach jeder Benutzereingabe überprüft werden.
Dazu kannst du eine Hilfsvariable verwenden, die du (immer wenn eine "neue" Zahl eingegeben worden ist) um 1 erhöhst und dann mit args[0] vergleichst.
Um deine Frage komplett beantworten zu können muss ich wissen für welches Konzept du dich entschieden hast.
import java.io.*;
public class Testklasse {
public static void main( String[] args) throws IOException {
int zahlenfeld[] = new int [Integer.parseInt(args[0])];
int anzahl = Integer.parseInt(args[1]);
BufferedReader ein = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Werte eingeben:");
int [] Werte = new int[anzahl];
for(int i=0; i<anzahl; i++) {
Werte[i]= Integer.parseInt(ein.readLine());
}
}
}
Habe die Fehler verbessert. Mit dem catch das hatten wir noch nicht leider
So könnte das Programm aussehen (Argumente: 5 10):
Java:
importjava.io.*;publicclassTestklasse{publicstaticvoidmain(String[] args){int zahlenfeld[]=newint[Integer.parseInt(args[0])];int anzahl =Integer.parseInt(args[1]);BufferedReader ein =newBufferedReader(newInputStreamReader(System.in));System.out.println("Werte eingeben:");int[] werte =newint[anzahl];for(int i =0; i < anzahl; i++){try{int eingegebeneZahl =Integer.parseInt(ein.readLine());if(eingegebeneZahl ==0){System.out.println("Fehler. Es wurde 0 eingegeben.");return;}boolean zahlGibtEsBereits =false;// Es wird geschaut, ob es die Zahl bereits gibt.for(int k =0; k < zahlenfeld.length; k++){if(zahlenfeld[k]== eingegebeneZahl){// Die Zahl gibt es bereits. Der Wert wird also um 1// erhoeht.
werte[k]= werte[k]+1;// k wird geaendert damit die Schleife nicht mehr// durchgelaufen wird.
k = zahlenfeld.length;
zahlGibtEsBereits =true;}}if(zahlGibtEsBereits ==false){int hoechsterIndexVonFreiemFeld =-1;for(int k =0; k < zahlenfeld.length; k++){if(zahlenfeld[k]==0){
hoechsterIndexVonFreiemFeld = k;}}// Falls kein Feld frei ist bedeutet das, dass args[0]// sozusagen// ausgeschoepft ist.if(hoechsterIndexVonFreiemFeld ==-1){// Mache nichts}// Falls das Array noch freie Felder hat wird die Zahl// eingefuegt.else{
zahlenfeld[hoechsterIndexVonFreiemFeld]= eingegebeneZahl;
werte[hoechsterIndexVonFreiemFeld]=1;}}}catch(NumberFormatException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}}System.out.println("\nErgebnisse:");for(int i =0; i < zahlenfeld.length; i++){if(zahlenfeld[i]!=0&& werte[i]!=0){System.out.println(zahlenfeld[i]+", "+ werte[i]);}}}}
Wenn du die Arrays erstellt sind sie von vornherein mit Nullen gefüllt. Das nutze ich aus, um zu gucken, ob ein Feld eine vom Benutzer eingegebene Zahl enthält.
Bei einer length von 10 wird die Schleife 10 mal durchlaufen, k geht dann von 0 bis 9. Wenn ich also will dass die Schleife vorzeitig abgebrochen wird muss ich k einfach auf 10 setzen.
Ich weiß jetzt, wie es eleganter geht (mithilfe von break):
Java:
// Es wird geschaut, ob es die Zahl bereits gibt.for(int k =0; k < zahlenfeld.length; k++){if(zahlenfeld[k]== eingegebeneZahl){// Die Zahl gibt es bereits. Der Wert wird also um 1// erhoeht.
werte[k]= werte[k]+1;
zahlGibtEsBereits =true;break;}}
Ich weiß jetzt, wieso die Reihenfolge falsch war. Ich habe nun hoechsterIndexVonFreiemFeld zu niedrigsterIndexVonFreiemFeld geändert und break eingefügt.
Java:
importjava.io.*;publicclassTestklasse{publicstaticvoidmain(String[] args)throwsIOException{int zahlenfeld[]=newint[Integer.parseInt(args[0])];int anzahl =Integer.parseInt(args[1]);BufferedReader ein =newBufferedReader(newInputStreamReader(System.in));System.out.println("Werte eingeben:");int[] werte =newint[anzahl];for(int i =0; i < anzahl; i++){int eingegebeneZahl =Integer.parseInt(ein.readLine());if(eingegebeneZahl ==0){System.out.println("Fehler. Es wurde 0 eingegeben.");return;}boolean zahlGibtEsBereits =false;// Es wird geschaut, ob es die Zahl bereits gibt.for(int k =0; k < zahlenfeld.length; k++){if(zahlenfeld[k]== eingegebeneZahl){// Die Zahl gibt es bereits. Der Wert wird also um 1// erhoeht.
werte[k]= werte[k]+1;
zahlGibtEsBereits =true;break;}}if(zahlGibtEsBereits ==false){int niedrigsterIndexVonFreiemFeld =-1;for(int k =0; k < zahlenfeld.length; k++){if(zahlenfeld[k]==0){
niedrigsterIndexVonFreiemFeld = k;break;}}// Falls kein Feld frei ist bedeutet das, dass args[0]// sozusagen// ausgeschoepft ist.if(niedrigsterIndexVonFreiemFeld ==-1){// Mache nichts}// Falls das Array noch freie Felder hat wird die Zahl// eingefuegt.else{
zahlenfeld[niedrigsterIndexVonFreiemFeld]= eingegebeneZahl;
werte[niedrigsterIndexVonFreiemFeld]=1;}}}System.out.println("\nErgebnisse:");for(int i =0; i < zahlenfeld.length; i++){if(zahlenfeld[i]!=0&& werte[i]!=0){System.out.println(zahlenfeld[i]+", "+ werte[i]);}}}}
Wenn du die Arrays erstellt sind sie von vornherein mit Nullen gefüllt. Das nutze ich aus, um zu gucken, ob ein Feld eine vom Benutzer eingegebene Zahl enthält.