java-forum.org - Java programmieren aus Leidenschaft
Java 6 Einstieg und professioneller Einsatz
Alter Preis: 34,90 EUR
Jetzt: 0,00 EUR

zzgl. Versandkosten

Zurück   java-forum.org - Java programmieren aus Leidenschaft > Java - Programmierung > Java Basics - Anfänger-Themen

Java Basics - Anfänger-Themen Fragen ausschließlich zu Java-Grundlagen von Ein- und Umsteigern

Thema geschlossen    
Themen-Optionen Thema durchsuchen Ansicht
Alt 21.04.2006, 19:49   #1 (permalink)
Neuer Benutzer
short
 
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Standard Kopieren eines Arrays

Hallo.

Ich habe begonnen einen Stack zu implementieren, denn ich nun auch fertig geschrieben habe. Hier schon mal der Quelltext:

Code:
public class Stack {
	
	public static final int CAPACITY = 1000;
	// Default-Laenge des Arrays
	
	private int capacity;
	// verwendete Laenge des Arrays
	
	private int[] S;
	// Array S um Stack zu implementieren
	
	private int top = -1;
	// Position des obersten Elements im Stack
	
	public Stack () {
		this(CAPACITY);
		}
	
	public Stack (int cap) {
		capacity = cap;
		S = new int [capacity];
		}
	// nur Initialisierung des Stacks
	
	public int size () {
		return (top + 1);
		}
	// gibt Hoehe des Stacks aus
	
	public boolean isEmpty () {
		return (top < 0);
		}
	
	public void push (int element) throws StackException {
		if (size() == capacity)
			throw new StackException("Stack ist voll");
		S[++top] = element;
		}
	
	public int top() throws StackException {
		if (isEmpty())
			throw new StackException("Stack ist leer");
		return S[top];
		}

	public int pop () throws StackException{
		if (isEmpty()) {
			throw new StackException("Stack ist leer");
			}
		int element = S[top--];
		return element;
		}
}


Nun wollte ich den Inhalt des Arrays in ein großeres Array kopieren, falls das Array voll sein sollte.


Code:
public class StackTestDrive {
	
	public static void main(String [] args) throws StackException {
		
		Stack Test = new Stack(5);
		
		Test.push(1);
		Test.push(2);
		Test.push(3);
		Test.push(4);
		Test.push(5);
		System.out.println(Test.size());
		System.out.println(Test.isEmpty());
		Test.push(6);

		}
	}

Dieses Programm bricht mit der Exception "Stack ist voll" ab. Dies soll aber nicht passieren, sondern die einzelnen Elemente sollen nun in ein großeres Array kopiert werden. Mir ist bekannt, dass ich eine Methode arraycopy() gibt, aber ich kann diese nicht einbauen. Kann mir da vielleicht einer helfen?
Wäre echt super. Vielen Dank.
sebjensen ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 21.04.2006, 19:58   #2 (permalink)
Premium-Benutzer
 
Benutzerbild von Beni
 
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
Sowas?
Code:
int[] oldS = ... // dein s
int[] newS = new int[ oldS.length * 2 + 1 ]; // nächster Array mit doppelter Grösse
System.arraycopy( oldS, 0, newS, 0, oldS.length ); // kopieren
oldS = newS; // zuweisen
__________________
dock.javaforge.com

Byte-Welt
Beni ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 21.04.2006, 20:02   #3 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Das sieht prinzipiell schon mal nicht schlecht aus, aber wo in den Code packe ich das hin, und was gehört genau in die Zeile

Code:
int [] oldS =  ...

Der Abschnitt müsste doch eigentlich in die PUSH-Methode, da nur dort dieser Fehler auftreten kann.


Dieser Abschnitt läuft leider nicht:

Code:
int[] newS = new int[ oldS.length * 2 + 1 ];
sebjensen ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 21.04.2006, 21:12   #4 (permalink)
Stammbenutzer
Viertel Gigabyte
 
Registriert seit: 24.11.2005
Fachbeiträge: 3.182
Abgegebene Danke: 7
Erhielt 89 Danke für 89 Beiträge
Zitat: sebjensen
was gehört genau in die Zeile
Code:
int [] oldS =  ...
Code:
int[] oldS = S;
Zitat: sebjensen
Der Abschnitt müsste doch eigentlich in die PUSH-Methode, da nur dort dieser Fehler auftreten kann.
Richtig, das Vergrößern muss anstelle der Exception passieren.

Zitat: sebjensen
Dieser Abschnitt läuft leider nicht:

Code:
int[] newS = new int[ oldS.length * 2 + 1 ];
Was läuft denn da nicht?
Murray ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 22.04.2006, 07:04   #5 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Hallo.

Also ich habe jetzt insgesamt diese beiden Klassen, wie folgt programmiert:

Code:
public class Stack {
	
	public static final int CAPACITY = 1000;
	// Default-Laenge des Arrays
	
	private int capacity;
	// verwendete Laenge des Arrays
	
	private int[] S;
	private int[] newS;
	// Array S um Stack zu implementieren
	
	private int top = -1;
	// Position des obersten Elements im Stack
	
	public Stack () {
		this(CAPACITY);
		}
	
	public Stack (int cap) {
		capacity = cap;
		S = new int [capacity];
		}
	// nur Initialisierung des Stacks
	
	public int size () {
		return (top + 1);
		}
	// gibt Hoehe des Stacks aus
	
	public boolean isEmpty () {
		return (top < 0);
		}
	
	public void push (int element) throws StackException {
		if (size() == capacity) {
			int[] oldS = S; 
			newS = new int[oldS.length * 2 + 1 ];
			System.arraycopy(oldS, 0, newS, 0, oldS.length );
			oldS = newS; // zuweisen
		}
		S[++top] = element;
		}
	
	public int top() throws StackException {
		if (isEmpty())
			throw new StackException("Stack ist leer");
		return S[top];
		}

	public int pop () throws StackException{
		if (isEmpty()) {
			throw new StackException("Stack ist leer");
			}
		int element = S[top--];
		return element;
		}
}




public class StackTestDrive {
	
	public static void main(String [] args) throws StackException {
		
		Stack Test = new Stack(5);
		
		Test.push(1);
		Test.push(2);
		Test.push(3);
		Test.push(4);
		Test.push(5);
		System.out.println(Test.size());
		System.out.println(Test.isEmpty());
		Test.push(6);
		System.out.println(Test.size());
		}
	}

Wenn ich nun das Programm starte, dann müssete eigentlich bei dem Test.push(6) das Array vergrößert werden, aber leider erhalte ich die folgende Fehlermeldung!

Code:
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at edu.cau.informatikII.vorlesungsprogramme.Stack.push(Stack.java:44)
	at edu.cau.informatikII.vorlesungsprogramme.StackTestDrive.main(StackTestDrive.java:16)
false
sebjensen ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 22.04.2006, 09:23   #6 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Also. Das Programm schmeisst keine Fehlermeldung mehr, aber es erzielt nicht das gewünschte Ergebnis:


Code:
package edu.cau.informatikII.vorlesungsprogramme;

public class Stack {
	
	public static final int CAPACITY = 1000;
	// Default-Laenge des Arrays
	
	private int capacity;
	// verwendete Laenge des Arrays
	
	private int[] S;
	private int[] newS;
	// Array S um Stack zu implementieren
	
	private int top = -1;
	// Position des obersten Elements im Stack
	
	public Stack () {
		this(CAPACITY);
		}
	
	public Stack (int cap) {
		capacity = cap;
		S = new int [capacity];
		}
	// nur Initialisierung des Stacks
	
	public int size () {
		return (top + 1);
		}
	// gibt Hoehe des Stacks aus
	
	public boolean isEmpty () {
		return (top < 0);
		}
	
	public void push (int element) throws StackException {
		if (size() == capacity) {
			int[] oldS = S; 
			newS = new int[oldS.length * 2 + 1 ];
			System.arraycopy( oldS, 0, newS, 0, oldS.length ); // kopieren 
			//newS = oldS; // zuweisen
		}
		else {
			S[++top] = element;
			}
		}
	
	public int top() throws StackException {
		if (isEmpty())
			throw new StackException("Stack ist leer");
		return S[top];
		}

	public int pop () throws StackException{
		if (isEmpty()) {
			throw new StackException("Stack ist leer");
			}
		int element = S[top--];
		return element;
		}
}

Mit meinem Beispiel ergibt das:

Code:
public class StackTestDrive {
	
	public static void main(String [] args) throws StackException {
		
		Stack Test = new Stack(5);
		
		Test.push(2);
		Test.push(4);
		Test.push(6);
		Test.push(8);
		Test.push(10);
		System.out.println(Test.size());
		System.out.println(Test.isEmpty());
		System.out.println(Test.top());
		Test.push(12);
		System.out.println(Test.top());
		Test.push(23);
		System.out.println(Test.top());
		}
	
	}
Code:
5
false
10
10
10
sebjensen ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 22.04.2006, 09:35   #7 (permalink)
Premium-Benutzer
 
Benutzerbild von Beni
 
Registriert seit: 07.02.2004
Fachbeiträge: 7.817
Abgegebene Danke: 10
Erhielt 152 Danke für 74 Beiträge
Code:
   public void push (int element) throws StackException {
      if (size() == S.length ){
    	  int[] newS = new int[ S.length * 2 + 1 ]; // nächster Array mit doppelter Grösse
    	  System.arraycopy( S, 0, newS, 0, S.length ); // kopieren
    	  S = newS; // zuweisen
      }
      S[++top] = element;
  }
__________________
dock.javaforge.com

Byte-Welt
Beni ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Alt 22.04.2006, 09:43   #8 (permalink)
Neuer Benutzer
short
Themenstarter
 
Registriert seit: 08.04.2006
Fachbeiträge: 20
Abgegebene Danke: 0
Erhielt 0 Danke für 0 Beiträge
Vielen Dank!
Es läuft super!
Vielen, vielen Dank!
sebjensen ist offline  
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Thema geschlossen    

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Info eines Webseites kopieren Gast Netzwerkprogrammierung 16 26.04.2007 22:07
Ausgabe eines Arrays Eleanor Java Basics - Anfänger-Themen 3 18.01.2006 14:19
Problem bei Kopieren eines Ordners rtt Allgemeine Java-Themen 13 09.08.2005 11:50
eigenschaften eines objekt kopieren. how? b166-er Java Basics - Anfänger-Themen 8 10.02.2005 11:51
Inhalt eines JPanel kopieren dirkop AWT, Swing, JavaFX & SWT 7 19.07.2004 15:40


Lesezeichen

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 Uhr.


Powered by vBulletin® Version 3.8.6 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.2
Thanks for Smilies by smilies.4-user.de