Variable auf andere Variable zeigen lassen

  • Themenstarter Themenstarter JavaNewbie69
  • Beginndatum Beginndatum
J

JavaNewbie69

Gast
Hallo, Leute!

Folgende Situation:
Ich habe ein Array s dessen Größe beim Programmstart durch den User festgelegt wird.
Dann können Werte hereingeschrieben und auch wieder abgerufen werden.
Wenn das Array nun voll ist, soll ein doppelt so großes Array angelegt werden und die Werte des alten Arrays in das neue Array kopiert werden.
Das klappt auch alles wunderbar.

Hier der Code:
Java:
package paket;

class BetterStack {

	private int[] s;
	private int[] s2;
	private int counter;
	private boolean underflow, overflow;

	public int getCounter() {
		return counter;
	}

	public BetterStack(int size) {
		s = new int[size];
		counter = 0;
	}

	public void push(int x) {
		overflow = (counter >= s.length);
		if (!overflow) {
			s[counter] = x;
			counter++;
		} else {
			s2 = new int[counter*2];
			System.arraycopy(s, 0, s2, 0, counter);
			// ------------------------------
			// Hier weiß ich nicht mehr weiter
			// ------------------------------

		}
	}

	public int pop() {
		underflow = (counter == 0);
		if (!underflow) {
			counter--;
			return s[counter];
		} else {
			throw new RuntimeException("Stack underflow");
		}
	}
}

An der markierten Stelle (Hier weiß ich nicht mehr weiter) soll die Variable s nun eine Referenz auf die Variable s2 sein,
sodass die Methoden push und pop jetzt das neue Array bearbeiten.
Aber wie mache ich das in JAVA?
Pointer?

Gruß
 
Java:
s = s2;
s und s2 sind dann zwei unabhängige Pointer die zum selben Objekt zeigen. Wenn du später "s2 = new...." machst, wird s davon nicht beeinflusst.
 
Code:
s = s2;
😉

EDIT:
Du brauchst s2 auch nicht als Membervariable zu deklarieren. Es reicht wenn du s2 lokal erstellst und dann die referenz auf s änderst.
 
Zuletzt bearbeitet von einem Moderator:
s=s2 wurde eingefügt

beim testen mit folgender main
Java:
BetterStack marvinsStack = new BetterStack(3);
		
		marvinsStack.push(11);
		marvinsStack.push(22);
		marvinsStack.push(33);
		
		marvinsStack.Ausgabe();
		
		marvinsStack.push(44);
		
		marvinsStack.Ausgabe();

wird jetzt keine exception mehr gewurfen, er gibt mir aber auch beim zweiten mal das array nur bis 33 aus -.-

hier die Ausgabe-Methode:

Java:
public void Ausgabe() {
		for (int i=0; i < getCounter(); i++) {
			System.out.println("Index " + i + ": " + s[i]);
		}
	}
 
Bei nem overflow erstellst du ja auch nur nen neues Array. Den Wert fügst du nicht hinzu.
Etwas umgeschrieben haut das schon hin:
Java:
    public void push(int x) {
    	boolean overflow = counter >= s.length;
        if (overflow) {
            int[] s2 = new int[counter*2];
            System.arraycopy(s, 0, s2, 0, counter);
            s = s2;
        }

        s[counter] = x;
        counter++;
    }
 
Vielen Dank EikeB.
Dein Code funktioniert einwandfrei fehlte halt nur noch der alte else-Zweig.

Jetzt habe ich aber noch ein Problem mit der pop()-Methode

Wenn das Array jetzt nur noch zur Hälfte mit Werten beschrieben ist,
soll ein neues Array angelegt werden, was nur noch halb so groß ist wie das alte Array.
Die Werte vom alten Array werden natürlich wieder in das neue Array geschrieben.

So sieht meine Methode jetzt aus:
Java:
public int pop() {
		underflow = (counter == 0);
		if (!underflow) {
			counter--;
			if(counter <= s.length/2) {
				int[] s2 = new int[counter+1];
				System.arraycopy(s, 0, s2, 0, counter);
				s = s2;
			}
			return s[counter];
		} else {
			throw new RuntimeException("Stack underflow");
		}
	}

So "funktioniert" die Methode.
Das blöde ist halt nur das die Größe des neuen Arrays nicht die Hälfte des alten Arrays sondern durch das "counter+1" die Hälfte+1 mal so groß ist wie das alte Array.
Wenn ich die "+1" allerdings weg lasse, hat das Array die gewünschte Größe allerdings bekomme ich dann eine Index out of Bounds Exception.
Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
	at paket.BetterStack.pop(BetterStack.java:51)
	at paket.StackTest.main(StackTest.java:20)
Bin grad völlig ratlos.
Ich hoffe mal ihr könnt mir auch hierbei helfen^^
 

Zurück
Oben