Beliebig viele Werte in Array zwischenspeichern

The_Virus

Mitglied
Ich soll mal wieder ein Programm für die Uni schreiben. Es geht um die Berechnung von Rationalen Zahlen. In meinem Programm wird eine Rechnung ausgeführt z.B. Bruch1 + Bruch2 und das Ergebnis ausgegeben. Die Aufgabe (Bruch1 + Bruch2 = Ergebnis) soll nun in einem Array gespeichert werden. Danach wird abgefragt, ob nochmal gerechnet werden soll und das Programm läuft von vorne. Wenn man beenden will (Abfrage auf "nein") soll das Programm alle gespeicherten Aufgaben nochmal ausgeben. Doch ein Array hat eine feste Länge und ist nicht variabel. Wenn ich nun mein Array auf 5 festlege und 6 Berechnungen durchführe, gibt es ExceptionOutOfBounds.

Eine mögliche Lösung wäre eine ArrayList, denn die ist variabel. Doch in der Aufgabe steht eigentlich explizit Array nicht ArrayList. Und vielleicht gibt es ja da einen Trick, um das doch mit einem Array zu lösen ?!
Eine andere unschöne aber simple Lösung wäre, dem Array einfach 1000 Stellen zu geben und dann am Ende alle null Stellen irgendwie "abzuschneiden" bzw. sie einfach nicht auszugeben.

Hier mal die main() zu meinem Prog. Hab es jetzt erstmal mit ArrayList gelöst.
Java:
package paketRationaleZahlen;
import java.util.ArrayList;

public class Start {

	public static void main(String[] args) {
		
		RationaleZahl bruch1 = new RationaleZahl(0,0);
		RationaleZahl bruch2 = new RationaleZahl(0,0);
		ArrayList<String> rechnungListe = new ArrayList<String>();
		int durchlauf = 1;
		
		do{
			bruch1 = Rechnung.einlesen();
			Rechnung.operation();
			bruch2 = Rechnung.einlesen();
			if(Rechnung.getOperator().equals("+")) {
				System.out.println(Rechnung.addieren(bruch1, bruch2));
				rechnungListe.add(Rechnung.addieren(bruch1, bruch2));
			}
			if(Rechnung.getOperator().equals("-")) {
				System.out.println(Rechnung.subtrahieren(bruch1, bruch2));
				rechnungListe.add(Rechnung.subtrahieren(bruch1, bruch2));
			}
			if(Rechnung.getOperator().equals("*")) {
				System.out.println(Rechnung.multiplizieren(bruch1, bruch2));
				rechnungListe.add(Rechnung.multiplizieren(bruch1, bruch2));
			}
			if(Rechnung.getOperator().equals("/")) {
				System.out.println(Rechnung.dividieren(bruch1, bruch2));
				rechnungListe.add(Rechnung.dividieren(bruch1, bruch2));
			}
			Rechnung.weiter();
			durchlauf++;
		}while(Rechnung.getWeiter().equals("j"));
		
		if(Rechnung.getWeiter().equals("n")) {
			System.out.println("--------Berechnet wurden--------");
			System.out.println(rechnungListe);
		}	
	}
}
Was meint ihr?
 

The_Virus

Mitglied
...wenn das Array voll ist, ein größeres Array zu erstellen und die Werte rüberkopieren.
Ich hab mich da nochmal eingelesen, und Logaff hat Recht, die ArrayList macht genau das. Denn sie hat intern ein Array mit bestimmter Größe, legt ein neues größeres an, wenn das erste voll ist, und kopiert die Werte ins neue Array.

Daher werde ich doch bei der Arraylist bleiben. Das ist nicht nur deutlich einfacher, weil es mir die "Arbeit abnimmt", sondern auch viel eleganter, weil es weniger Code ist.
 

The_Virus

Mitglied
Unsere Professorin ist da nicht so streng. Solange ich erklären kann, was die ArrayList macht und wie ich das in einem Code verwende, dürfen wir das auch verwenden. Denn wir müssen alle unsere Aufgaben präsentieren, ihr den gesamten Code erklären und vorführen.

Aber rein aus Interesse, wie würde ich denn diese ArrayList Logik selbst programmieren? Also wann weiß das Array, dass es voll ist?
Neues Array anlegen und Werte rüber kopieren sollte ja kein Problem sein. Aber woher weiß das neue Array, an welcher Stelle es dann fortsetzen soll?
 

Andi_CH

Top Contributor
Ein Quick and dirty Ansatz

Java:
public class ArrayDemo {

	private int[] arr;
	private int lastSet;
	private final int capInc;

	ArrayDemo(int initialCapacity, int capacityIncrement) {
		arr = new int[initialCapacity];
		lastSet = -1;
		capInc = capacityIncrement;
	}

	public void add(int i) {
		if (lastSet == arr.length-1) {
			int[] tmp = new int[arr.length+capInc];
			System.arraycopy(arr, 0, tmp, 0, arr.length);
			arr = tmp;
		}
		arr[++lastSet] = i;
	}

	@Override
	public String toString() {
		String retVal = "[ ";
		for (int i=0; i<=lastSet; i++) {
			retVal += i + " ";
		}
		retVal += "]";
		return retVal;
	}

	public static void main(String[] args) {
		ArrayDemo arrd = new ArrayDemo(1, 2);
		for (int i=0; i<5; i++) {
			arrd.add(i);
			System.out.println(arrd);
		}
	}
}

Ein wesentlich besseres Beispiel, das aber möglicherweise nicht so einfach zu verstehen ist, findest du wohl im Sourceode der ArrayList :)
 

The_Virus

Mitglied
Danke für deine Lösung, dennoch verstehe ich sie nicht so ganz. Ist mir irgendwie zu komplex, zu viele Variablen.
Da bleib ich doch lieber bei ArrayList.
 
G

Gast2

Gast
Der spannende Teil ist der hier:
Java:
        if (lastSet == arr.length-1) {
            int[] tmp = new int[arr.length+capInc];
            System.arraycopy(arr, 0, tmp, 0, arr.length);
            arr = tmp;
        }
In der ArrayList passiert das ähnlich, nur dass da meines Wissens nach mit nem Faktor multipliziert wird.
Analog wird das Array wieder verkleinert wenn wenig werte drin stehen.
 

The_Virus

Mitglied
was bedeudet "arr = tmp" ?
Wird arr dabei mit dem neuen Array tmp überschrieben?

Hab den speziellen Teil mal übernommen und es läuft auch irgendwie. Das Programm kann zwei Rechnungen speichern, obwohl das erste Array nur einen Speicherplatz hat. Dennoch kommt danach ein NullPointerException.
Java:
package paketRationaleZahlen_Test;

public class Start_Test {

	public static void main(String[] args) {
		
		RationaleZahl_Test bruch1 = new RationaleZahl_Test(0,0);
		RationaleZahl_Test bruch2 = new RationaleZahl_Test(0,0);
		String[] rechListe = new String[1];
		int durchlauf = 0; // Zaehler, wie viele Werte geschrieben wurden
		
		do{
			bruch1 = Rechnung_Test.einlesen();
			Rechnung_Test.operation();
			bruch2 = Rechnung_Test.einlesen();
			// geänderter Teil
			if(durchlauf >= rechListe.length) {
				String[] tempListe = new String[rechListe.length + 1];
				System.arraycopy(rechListe, 0, tempListe, 0, rechListe.length);
				rechListe = tempListe;
			} //bis hier		
			if(Rechnung_Test.getOperator().equals("+")) {	
				rechListe[durchlauf] = Rechnung_Test.addieren(bruch1, bruch2);
				System.out.println(rechListe[durchlauf]);
			}
			if(Rechnung_Test.getOperator().equals("-")) {
				rechListe[durchlauf] = Rechnung_Test.subtrahieren(bruch1, bruch2);
				System.out.println(rechListe[durchlauf]);
			}
			if(Rechnung_Test.getOperator().equals("*")) {
				rechListe[durchlauf] = Rechnung_Test.multiplizieren(bruch1, bruch2);
				System.out.println(rechListe[durchlauf]);
			}
			if(Rechnung_Test.getOperator().equals("/")) {
				rechListe[durchlauf] = Rechnung_Test.dividieren(bruch1, bruch2);
				System.out.println(rechListe[durchlauf]);
			}
			durchlauf++;
			Rechnung_Test.weiter();
		}while(Rechnung_Test.getWeiter().equals("j"));
		
		if(Rechnung_Test.getWeiter().equals("n")) {
			System.out.println("--------Berechnet wurden--------");
			for(int i = 0; i < durchlauf; i++) {
				System.out.println(rechListe[i]);
			}
		}	
	}
}
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Na wenn das schon zu komplex ist, viel Spass für die Zukunft ....

Also was
Code:
arr
ist, dürfte ja klar sein. Das ist die Referenz auf den produktiven Array.
Wenn der voll ist, lege ich einen neuen Array an (Arraylist berechnet die neue Länge natürlich etwas komplexer) Die Referenz
Code:
tmp
zeigt da drauf (ich brauche ja den alten noch, weil da die Werte drin stehen)
Dann kopiere ich den Inhalt von arr nach tmp.

Die Zeile
Code:
arr = tmp
bewirkt nur, dass die Referenz arr jetzt auf den neuen Array zeigt.
Der Alte liegt noch im Speicher herum, wird aber bei nächster Gelegenheit vom GarbageCollector weggeräumt.

Code:
lastSet
oder etwas ähnliches brauchst du zwingend auch, sonst weisst du ja nicht wieviele Element du schon geschrieben hast und
Code:
capInc
ist keine Variablen sondern Konstanten die das Testen vereinfacht - die Anfangsgrösse und das Inkrement würde ich natürlich niemals so klein wählen, aber es hilft beim Testen.

Das erstens für das Verständnis und zweitens falls du doch Array verwenden müsstest.

ArrayList ist natürlich so nett und führt das alles schön brav mit, ist also sicher besser geeignet für dich, ausser eben das Ziel der Übung wäre genau diesen Mechanismus zu implementieren um ihn zu verstehen.
 
Zuletzt bearbeitet:

The_Virus

Mitglied
Danke nochmal für deine Erklärung. Ich hab meine main() nun korrigiert und es läuft genau so, wie ich mir das vorgestellt hatte. Diesen Teil hab ich hinzugefügt:
Java:
if(durchlauf >= rechListe.length) {
	String[] tempListe = new String[rechListe.length + 1];
	System.arraycopy(rechListe, 0, tempListe, 0, rechListe.length);
	rechListe = tempListe;
}
Code:
durchlauf
ist bei mir der Zaehler, wie bei dir
Code:
lastSet
.
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Vector ist auch nicht deprecated. Vector ist halt eine synchroniserte Liste. Das letzte was der Vector genießen durfte war die Implementierung des List-Interfaces.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
T Variablen Beliebig viele Arrays in Schleife erstellen Java Basics - Anfänger-Themen 1
B Beliebig viele Rechtecke erzeugen Java Basics - Anfänger-Themen 5
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
Prafy Beliebig viele Arrays erstellen? Java Basics - Anfänger-Themen 2
J Methoden Beliebig viele Objekt-Eingabeparameter im Konstruktor Java Basics - Anfänger-Themen 6
H Reflexion: Eine Methode, beliebig viele Parameter (Java 1.4.2) Java Basics - Anfänger-Themen 8
M Arrayliste mit beliebig vielen Namen befüllen Java Basics - Anfänger-Themen 4
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
V Erste Schritte Taschenrechner mit beliebig vielen Zahlen Java Basics - Anfänger-Themen 5
JDimi Textdatei mit beliebig vielen Zeilenumbrüchen erstellen Java Basics - Anfänger-Themen 2
RowdyN Variablen Variablen beliebig benennen? Java Basics - Anfänger-Themen 6
W Klassen [GELÖST] Objekte während der Laufzeit mit neuen veränderten Werten beliebig oft initialisieren Java Basics - Anfänger-Themen 2
M Erzeugen beliebig vieler Objekte, aber wie wechselnde Bezeichner? Java Basics - Anfänger-Themen 5
P Schneller Quadratzahltest für beliebig große natürliche Zahlen Java Basics - Anfänger-Themen 2
T beliebig langes Array berechnen Java Basics - Anfänger-Themen 4
G Eingabe beliebig lang machen Java Basics - Anfänger-Themen 8
H Die Eingabe von beliebig vielen Zahlen in ein Array - ich kann es nicht Java Basics - Anfänger-Themen 6
R Regexp nur Buchstaben und Ziffener beliebig oft Java Basics - Anfänger-Themen 3
A Beliebig Java Basics - Anfänger-Themen 3
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
s_1895 zu viele Zeilen in der Main Methode Java Basics - Anfänger-Themen 4
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
P Nutzer entscheiden lassen, wie viele Zahlen dieser in ein Array eingeben möchte. Java Basics - Anfänger-Themen 6
S Hilfe : Unendlich viele Zufallszahlen erstellen? Java Basics - Anfänger-Themen 8
I Wie viele 1 an Bits hat die Zahl x? Java Basics - Anfänger-Themen 5
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
M Aufgabe: Eine Klasse und viele Untermethoden Java Basics - Anfänger-Themen 30
D Klassen Doppelt so viele Elemente in Arraylist ? Java Basics - Anfänger-Themen 4
D zu viele MySQL Connections Java Basics - Anfänger-Themen 18
F Threads ftp4j, viele Dateien upload Java Basics - Anfänger-Themen 5
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
D Viele grafische unterschiede von Windows xp zu Windows 7 Java Basics - Anfänger-Themen 3
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
T Zu viele Fenster - HILFE! Java Basics - Anfänger-Themen 5
T viele "kleine" Fragen... Java Basics - Anfänger-Themen 3
M Zu viele Verkettungen von Klassen Java Basics - Anfänger-Themen 4
G Erste Schritte Wie viele Montage gab es? Java Basics - Anfänger-Themen 14
M Input/Output Viele short aus Datei lesen und von Little Endian zu Big Endian umwandeln Java Basics - Anfänger-Themen 12
S Variablen viele Instanzvariablen vermeiden Java Basics - Anfänger-Themen 14
El_Lobo Methoden Zu viele Getter- und Settermethoden - geht das einfacher? Java Basics - Anfänger-Themen 3
L buffered reader produziert zu viele und seltsame zeichen Java Basics - Anfänger-Themen 2
D Erste Schritte Viele Objekte einer Klasse "verwalten" Java Basics - Anfänger-Themen 17
S Viele Fragen von einem Anfänger in Java Java Basics - Anfänger-Themen 2
F Viele Controller-Klassen Java Basics - Anfänger-Themen 5
P Datentypen extrem viele Fehler nur irgendwie seh ich den Grund ned... Java Basics - Anfänger-Themen 3
M Viele GUI-Variablen Java Basics - Anfänger-Themen 4
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
U JTable viele möglichkeiten, keine Lösung Java Basics - Anfänger-Themen 5
M Viele verschachtelte Schleifen Java Basics - Anfänger-Themen 14
Avalarion Erschaffung eines Shadowrun Charaktergenerators - Viele, Viele Fragen! Java Basics - Anfänger-Themen 6
S Viele Konstanten, EnumSet? Java Basics - Anfänger-Themen 3
S Stilfrage: Neue Klasse wenn es in einer Klasse zu viele Methoden gibt? Java Basics - Anfänger-Themen 14
Kasu So viele "_ " ausgeben, wie ein String lang ist Java Basics - Anfänger-Themen 4
I viele Dateinamen in ein String-Array mit File().list() Java Basics - Anfänger-Themen 4
mwildam Textfile lesen und schreiben - so viele Möglichkeiten Java Basics - Anfänger-Themen 5
U Zu viele werte in einer klasse Java Basics - Anfänger-Themen 4
K Viele Fragen eines Anfängers-Fließkommazahlen/Typenwandlung Java Basics - Anfänger-Themen 5
W Viele Objekte mit einem Konstrukor erzeugen Java Basics - Anfänger-Themen 10
R einfaches Programm, viele Probleme Java Basics - Anfänger-Themen 29
G viele zahlen mit wenig code Java Basics - Anfänger-Themen 4
X 1 MySQL-Verbindung und viele Threads Java Basics - Anfänger-Themen 4
E Viele Fragen Java Basics - Anfänger-Themen 8
J viele Objekte erzeugen Java Basics - Anfänger-Themen 21
J Große *.Text Datei zum verschicken in viele kleine Java Basics - Anfänger-Themen 7
O viele Name mit jeweils zugehörigen Status in .txt Speichern Java Basics - Anfänger-Themen 16
K ResultSet: Wie viele Rows beinhaltet es? Java Basics - Anfänger-Themen 6
X Viele Komponenten automatisch erzeugen Java Basics - Anfänger-Themen 2
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
M Viele Textfelder auslesen Java Basics - Anfänger-Themen 3
P x-viele Variablen anlegen Java Basics - Anfänger-Themen 2
F Mit der Zahl n n-viele Arrays erstellen ?! Java Basics - Anfänger-Themen 4
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
F 2x 16bit Werte zu einem 32bit und dann splitten mit 0xb Java Basics - Anfänger-Themen 1
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum sind Werte in den Feldern ? Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
javaBoon86 Arrays 2 Dimension Werte ausgeben Java Basics - Anfänger-Themen 15
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
TeacherMrSSimon Schachspiel, Werte in Figur eintragen klappt nicht Java Basics - Anfänger-Themen 23
TheSepp Nur Arrays ausgeben, die Werte zugewiesen haben. Java Basics - Anfänger-Themen 4
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
docmas 2DArray Werte werden nur untereinander ausgegeben Java Basics - Anfänger-Themen 1
M Nur int-Werte erlauben Java Basics - Anfänger-Themen 11
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
Fats Waller Compiler-Fehler Kann ich einen String und die Summe zweier Char Werte mittels der println Anweisung ausgeben Java Basics - Anfänger-Themen 4
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
M Wie kann eine Methode eine andere Methode um Werte wie z.B. 1 erhöhen? Java Basics - Anfänger-Themen 6
Igig1 Wie lasse ich dir Werte in einem Array zusammenrücken? Java Basics - Anfänger-Themen 4
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
E Meine JCombobox werte an ohne selectiert zu haben Java Basics - Anfänger-Themen 6
H OOP Werte mit Set verändern Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben