Array Werte einfügen/löschen/ändern?
Hallo ich bin gerade am Java lernen und habe folgendes Problem:
Ich habe ein Array erstellt in dem ich angebe wie viele Zahlen ich eingeben will und diese dann eingeben kann. Nun möchte ich über Switch-Case dem Benutzer die Möglichkeit geben Werte neu an eine beliebige Stelle einzufügen / einen Wert zu löschen / oder einen Wert abzuändern.
import java.util.Scanner;
public class Hausaufgabe71 {
public static void main(String[] args) {
Scanner eingabe = new Scanner(System.in);
System.out.println("Wie viele Zahlen sollen eingegeben werden?");
int anzahlZahlen = eingabe.nextInt();
double[] zahlen = new double[anzahlZahlen];
for (int i = 0; i < zahlen.length; i++) {
System.out.print("Zahl " + (i + 1) + ": ");
zahlen[i] = eingabe.nextDouble();
}
System.out.print("\nAktuelle Zahlen: ");
for (double element : zahlen) {
System.out.print(element + " ");
}
System.out.println("\nSumme: " + summe(zahlen) + " " + "Durchschnitt: "
+ durchschnitt(zahlen));
System.out.println("Was möchten Sie tun?\n1) Zahl einfügen\n2) Zahl"
+ " löschen \n3) Zahl ändern \n4) Beenden");
int menue = eingabe.nextInt();
switch (menue) {
case 1:
System.out.println("\nAn welcher Position möchten Sie die Zahl "
+ "ändern?\n(1 = erste Zahl; " + (zahlen.length + 1)
+ " = hinten anfügen)");
int pos = eingabe.nextInt();
break;
}
}
public static double summe(double[] zahlen) {
double sum = 0;
for (double value : zahlen) {
sum += value;
}
return sum;
}
public static double durchschnitt(double[] zahlen) {
double dur = 0;
for (int i = 0; i < zahlen.length; i++) {
dur += zahlen[i];
}
return dur / zahlen.length;
}
}
Das ist mein bisheriger Quelltext.
Hat jemand einen Ansatz für mich wie ich diese Punkte realisiere?
MfG
1 Antwort
Naja. Der User muss angeben können, welche Array-Position er ändern will. Achtung, Zählung beginnt bei 0. Dann muss er ggf. den neuen Wert eingeben.
Die Änderung von Werten eines Arrays erfolgt über
array[index] = wert;
Einfügen und Löschen stellen insofern ein Problem dar, als Arrays keine dynamische Länge haben. Daher musst Du bei beiden Operationen jeweils ein neues Array erzeugen, die Werte aus dem alten Array geeignet kopieren und "zahlen" auf dieses neue Array setzen. Beispiel für das Löschen:
double[] neueZahlen = new double[zahlen.length - 1];
// Zahlen vor dem zu löschenden Index kopieren
for (int i = 0; i < indexZuLöschen; i++)
{
neueZahlen[i] = zahlen[i];
}
// Zahlen nach dem zu löschenden Index kopieren.
// Index-Shift beachten!!
for (int i = indexZuLöschen + 1; i < zahlen.length; i++)
{
neueZahlen[i-1] = zahlen[i];
}
zahlen = neueZahlen;
Das Einfügen erfolgt prinzipiell äquivalent, nur, dass Du zwischendrin den einzufügenden Wert setzen und beim Index-Shift dann i+1 schreiben musst.
Ich beschreibe mal die Schritte, dann kommst Du schon von alleine drauf :-) Also.
Einfügen bedeutet: Das Array muss ein Element länger werden (beachte: Beim Löschen wurde es ein Element kürzer - wie kann man es jetzt länger machen?).
Jetzt gibt es wieder ein Element, das die "Grenze" darstellt, nämlich die Einfügeposition. Du musst also jetzt (wie beim Löschen) alle Elemente bis hin zur Einfügeposition aus dem alten in das neue Array kopieren. Dann setzt Du an der Einfügeposition im neuen Array den neuen Wert. Jetzt ist es wichtig, genau zu überlegen: Die nachfolgenden Elemente des ursprünglichen Arrays sollen ja alle auch in das Array. Es soll keiner weggelassen werden. Wo muss also die Schleife beginnen und wie weit muss sie laufen? Du hast aber jetzt ein Element in das Ziel-Array eingefügt - wie ist also die Einfügeposition der restlichen Elemente?
Erst mal danke für die Hilfe.
Das löschen und ändern konnte ich dank dir umsetzten.
Könntest du mir jetzt noch mal bei dem einfügen helfen der sitzt bei mir noch nicht richtig?