In Java bestimmte Werte aus einem Array in Indexvariable eines neuen Arrays speichern?
Hallo,
ich habe gerade das Problem, dass ich an einer Aufgabe sitze, bei welcher man ein Neues Feld erzeugen soll in welchem die Werte aus einem vorgegebenen Feld so eingefügt werden, dass alle negativen Zahlen im linken Bereich und alle postiven Zahlen sowie 0 im rechten Bereich liegen. Gegeben ist folgender Code:
public static int randomInt(int a, int e) {
return (int) (Math.random() * ((e - a) + 1)) + a;
}
public static void fuellen(int[] feld, int a, int e) {
for (int i=0;i<feld.length;i++){
feld[i] = randomInt(a,e);
}
}
public static void ausgeben(int[] feld){
for (int i=0;i<feld.length;i++){
System.out.printf("%3d ", feld[i]);
if ((i+1) % 10 == 0) {
System.out.println();
}
}
System.out.println();
}
bis Jetzt war mein Ansatz dieser hier:
public static int[] verteilen(int[] feld){
int[] feld2 = new int[feld.length];
int first = feld2[0];
int last = feld2[feld2.length - 1];
int count = 0;
int right = feld2.length - 1;
for(int i=0;i<feld.length;i++) {
if(feld[i] < 0) {
first = feld[i];
count++;
}
else {
last = feld[i];
right--;
}
}
return feld2;
}
und als Ergebnis soll das rauskommen aber irgendwie klappt es nicht:
39-34 76-84-79-61-59-50 96 55 -71-51-89 77 64 93-20-86 43 33
-34 -84 -79 -61 -59 -50 -71 -51 -89 -20
-86 33 43 93 64 77 55 96 76 39
2 Antworten
int first = feld2[0];
int last = feld2[feld2.length - 1];
So klappt das nicht, denn die Variablen enthalten jetzt das erste und letzte Element von feld2. Der Wert ist aber uninteressant, weil Du dort noch gar nichts gespeichert hast. Was Du brauchst, sind diese Positionen, also nur der Index:
int first = 0;
int last = feld2.length - 1;
Und diese Stellen in feld2 musst Du befüllen, also
feld2[first] = feld[i]; // statt first = feld[i]
...
feld2[last] = feld[i]; // statt last = feld[i]
Die Variablen count und right brauchst Du gar nicht. Ändere stattdessen nach jedem Einfügen direkt die entsprechende Position (first++ oder last--)
Verstehe ich das richtig, dass die Zahlen einfach nach Vorzeichen sortiert werden sollen? Also erst alle negativen und dann alle positiven Werte, ohne Rücksicht auf die tatsächlichen Zahlen?
Du warst schon nah dran. Die Antwort von ralphdieter löst dein Problem. Der Code sieht dann so aus:
public static int[] verteilen(int[] feld){
int[] feld2 = new int[feld.length];
int first = 0;
int last = feld2.length - 1;
for(int i=0;i<feld.length;i++) {
if(feld[i] < 0) {
feld2[first] = feld[i];
first++;
}
else {
feld2[last] = feld[i];
last--;
}
}
return feld2;
}
Ich würde dir noch empfehlen, dass du die Variablennamen ein wenig anpasst. Einerseits solltest du nicht deutsche und englische Bezeichnungen durcheinanderwerfen, andererseits würde ich anstatt "feld2" z.B. den Namen "ergebnis" oder so nehmen, damit man gleich sieht wofür die Variable gut ist. (Wobei der vorgegebene Code in der Hinsicht noch schlimmer ist, als deiner, von daher brauchst du dir in der Schule wahrscheinlich noch keine Gedanken darum machen)
Ich bevorzuge bei solchen Aufgaben immer Streams, weil ich sie durch die Funktionsnamen übersichtlicher finde, als Funktionen mit geschachtelten Schleifen und ifs:
public static int[] verteilen(int[] feld) {
return Arrays
.stream(feld) // Wir streamen die Zahlen
.boxed() // und wandeln sie erstmal in Integer-Objekte um
//(damit man nach anderen Kriterien als dem Zahlenwert sortieren kann)
.sorted(Comparator.comparing(Integer::signum)) // sortieren sie nach Vorzeichen
.mapToInt(Integer::intValue) // wandeln sie sie wieder zurück in int-Werte
.toArray(); // und machen ein Array draus, was zurückgegeben wird
}
Ich habe auch zuerst an Streams gedacht, schon bei fuellen() via
return Random.ints(n, a, e).toArray();
Für die Funktion verteilen() reicht sogar
return IntStream.of(feld).sorted().toArray();
Aber erfahrungsgemäß basieren solche Übungsaufgaben auf Java 1.7 oder schlimmer, und man muss die Lösung auf einer 3.5"-Diskette abgeben. Es wäre ja auch zu viel verlangt, wenn sich ein Informatiklehrer mit dem neumodischen Zeug von vor 20 Jahren auseinandersetzen müsste!
Okay danke fuer die Hilfe, wir duerfen die Aufgaben halt leider nur mit den Sachen loesen die wirs bis jzt in der Vorlesung hatten.