Java Stack-Klasse implementieren?

Status
Für weitere Antworten geschlossen.

Peter Griffin

Commander
Registriert
Jan. 2010
Beiträge
2.828
Ich sitze hier gerade an einer Programmier-Aufgabe und weiß beim besten Willen nicht weiter.

Die Aufgabe:
Ihre Aufgabe besteht darin, selbst eine Klasse Stack zu implementieren. Ihre Klasse soll das Interface Stackable (siehe unten) implementieren. (Kopieren Sie den Quelltext in eine neue Quellcode-Datei.) Ihre Klasse soll keine weiteren öffentlichen Methoden anbieten. Verwenden sie intern in Ihrer Klasse eine geeignete Datenstruktur.
Code:
package aufgabenblatt05.stack;

public interface Stackable {
  /**
   * Tests if this stack is empty.
   * 
   * @return true if and only if this stack 
   *          contains no items; false otherwise.
   */
  boolean empty();

  /**
   * Looks at the object at the top of this stack 
   * without removing it from the stack.
   * 
   * @return the object at the top of this stack.
   *         null if the stack at hand is empty.
   */
  Object peek();

  /**
   * Removes the object at the top of this stack 
   * and returns that object as the value of this function.
   * 
   * @return The object at the top of this stack.
   *         null if the stack at hand is empty.
   */
  Object pop();

  /**
   * Pushes an item onto the top of this stack.
   * 
   * @param item
   *          - the item to be pushed onto this stack.
   */
  Object push(Object item);
  
  /**
   * Number of items on the stack.
   * 
   * @return Number of items contained by the stack.
   */
  int size();
}

Um Ihre Klasse zu testen, erzeugen Sie einen neuen JUnit-Test-Case. Rechtsklick auf Ihr Projekt
→ New → (ggf. Other) → JUnit Test Case → Option „New JUnit 4 test“ →
Name: StackTest → „Class under test: → Browse → Stack Klasse auswählen Kopieren Sie folgenden Quelltext in Ihre Testdatei:
Code:
package aufgabenblatt05.stack;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class StackTest {
  Object[] thingsToPush = {1,"Hello","World", 5};
  Stack myStack;
  
  
  @Before //  findet vor jedem @Test statt
  public void setUp() throws Exception {
    myStack = new Stack();
  }

  @Test
  public void Stack() {
    assertNotNull(myStack);
  }

  @Test
  public void empty() {
    assertTrue(myStack.empty());
    myStack.push(1);
    assertFalse(myStack.empty());
  }
  
  @Test
  public void size() {
    assertEquals(0, myStack.size());
    int expectedSize = 0;
    for (Object item : thingsToPush) {
      myStack.push(item);
      assertEquals(++expectedSize, myStack.size());
    }
  }
  
  @Test
  public void push() {
    for (Object item : thingsToPush) {
      myStack.push(item);
      assertEquals(item, myStack.peek());
    }
  }
  
  @Test
  public void peek() {
    for (Object item : thingsToPush) {
      myStack.push(item);
      assertEquals(item, myStack.peek());
    }
  }
  
  @Test
  public void peekAtEmptyStack() {
    assertEquals(null, myStack.peek());    
  }
  
  @Test
  public void popAtEmptyStack() {
    assertEquals(null, myStack.pop());    
  }

  @Test
  public void pop() {
    for (Object item : thingsToPush) {
      myStack.push(item);
    }
    
    List<Object> thingsPushedReversed = Arrays.asList(thingsToPush);
    Collections.reverse(thingsPushedReversed); 
    for (Object object : thingsPushedReversed) {
      assertEquals(object, myStack.pop());
    }
    
    assertTrue(myStack.empty());
  }
}

Darunter folgten dann jeweils die Quellcodes.

Wir arbeiten mit Eclipse. Das Problem ist jetzt, dass ich nicht mal weiß, wie ich überhaupt anfangen soll. Ich habe zunächst im neuen Eclipse-Workspace natürlich erst mal ein neues Projekt erstellt. Hier habe ich dann mit New -> Class eine neue Quellcode-Datei erzeugt. Den Text, der ja standardmäßig erst mal drin ist, habe ich rausgenommen und dafür den Quellcode aus der Aufgabe wie erfordert reinkopiert. Soweit ist noch alles gut, es werden also keine Fehler usw. angezeigt.

Jetzt soll ich ja aber die Klasse mit JUnit testen. Problematisch wird es jetzt schon mit dem Punkt "Stack Klasse auswählen". Ich gehe also auf "Browse" und es öffnet sich ein leeres Dialogfenster. Nachdem ich "Stack" oben eingegeben habe, erscheint eine Liste aus mehreren Einträgen (siehe Anhang). Hier soll ich nun die Stack-Klasse auswählen. Aber welchen Eintrag soll ich denn jetzt hier auswählen? Ich hatte einfach den obersten genommen, da dieser mir "richtig" erschien.

Es wurde also diese Testdatei erstellt, sodass ich in meinem Package Explorer nun zwei Quellcode-Dateien habe: die mit dem interface Stackable und dann eben die StackTest. In der StackTest-Datei steht dann bereits was drin, und ich wusste nun nicht, ob das nur um den Quellcode 2 aus der Aufgabe ergänzt oder aber ersetzt werden sollte. Also habe ich erstmal nur hinzugefügt. Da wurde dann aber vieles rot unterstrichen (vom Quellcode aus der Aufgabe auffälligerweise immer "Stack" und "myStack" sowie der komplette Teil, der sowieso schon in der Testdatei drin war). Dann habe ich den Teil, der schon drin war, rausgelöscht, sodass nur noch der Quellcode, denn wir vom Aufgabenblatt reinkopieren sollen, stehen bleibt. "myStack" und "Stack" blieben weiterhin stets rot unterstrichen. Beim Raufzeigen mit dem Mauszeiger wurde mir dann angezeigt "cannot be resolved to a type".

Ziel von diesem Test soll ja sein, dass keine Test-Methoden (pop, peek, push, size usw.) fehlschlagen, indem man den Stack geeignet implementiert. Aber ich kann den Test ja gar nicht erst ausführen.

Am unsichersten bin ich mir letztendlich bei folgenden Punkten:
  • Beim Erstellen der ersten Quellcode-Datei mit dem Interface der Package-Name (aufgabenblatt05, aufgabenblatt05.stack oder einfach frei lassen? Habe mich dort jedenfalls für aufgabenblatt05.stack entschieden, da das ja eigentlich auch in den Aufgaben-Quellcodes so hinter "package" steht)
  • Auswahl der Stack-Klasse beim JUnit-Test-Case
  • Brauche ich vielleicht auch erst noch eine dritte Quellcode-Datei? Oder muss ich die Stackable-Datei erst noch um etwas (außer dem vorgegebenen Quellcode aus der Aufgabe) ergänzen?

Ich habe mich jetzt stundenlang zu dem Thema belesen, aber trotzdem nichts Aufschlussreiches zu dieser Aufgabe finden können. Und das ist ja gerade mal die Vorbereitung/Einrichtung der Aufgabe, wie soll ich erst die eigentliche Aufgabe bewältigen können? :freak: :evillol:

Wäre echt nett, wenn mir jemand hier eine Starthilfe geben kann. :)

Danke im Voraus!
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    18,8 KB · Aufrufe: 569
Zuletzt bearbeitet:
Den Unterschied von einem Interface und einer Klasse die ein Interface implementiert kennst du?

Danach solltest du auch verstehen, wieso du mit den mitgelieferten Tests nicht die vorhandene Klasse java.util.Stack testen kannst (Ihre Aufgabe besteht darin, selbst eine Klasse Stack zu implementieren.)
 
Dein Screenshot beschreibt nur Klassen, die du nicht benötigst.

DU sollst die Klasse "Stack" selbst schreiben und das hast du nicht getan.
Ihre Aufgabe besteht darin, selbst eine Klasse Stack zu implementieren. Ihre Klasse soll das Interface Stackable (siehe unten) implementieren.
Mach genau das, was in der Aufgabenbeschreibung steht. Es wird dir hier hoffentlich keiner die Lösung präsentieren ;)
Bisher hast du ja nur die zwei Quellcodedateien per copypaste erzeugt. Ein wenig mehr ist schon noch zu tun :eek:

PS: du weißt hoffentlich, was "implementieren" bedeudet?
 
Zuletzt bearbeitet:
Das Thema hier wird eh bald / gleich zugemacht: "Keine (Haus)Aufgaben!"
 
Jetzt habe ich drei Quellcode-Dateien: Stackable (das Interface), StackTest und MyStack. Letztere soll also meine Stack-Klasse sein und sieht nun folgendermaßen aus:
Code:
package aufgabenblatt05.stack;

import java.util.Stack;

public class MyStack implements Stackable {

	public static void main(String[] args) {
		Stack<String> myStack = new Stack<String>();
		

	}

	@Override
	public boolean empty() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object pop() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Object push(Object item) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int size() {
		// TODO Auto-generated method stub
		return 0;
	}

}

Beim Erstellen dieser Klasse habe ich mich an diesem YouTube-Video orientiert: https://www.youtube.com/watch?v=Uf4O8wZ-keY

Die roten Markierungen in der StackTest-Datei bestehen aber leider immer noch. :(
 
Zuletzt bearbeitet:
DU sollst die Klasse implementieren, nicht nur von der IDE stubs generieren lassen...

Da das eine (Haus)aufgabe ist, wirst du sicher vorher genug dazu erzählt bekommen haben, zumindest genug um ganze 2 Attribute und 4 Methoden schreiben zu können. Im interface ist doch sogar alles beschrieben.

Edit:
Peter Griffin schrieb:
Die roten Markierungen in der StackTest-Datei bestehen aber leider immer noch. :(
Da schau warum die da sind.
Protip: Google kennt 99,9999% aller Fehlermeldungen ;)
 
Zuletzt bearbeitet:
Für mich sieht es irgendwie so aus als fehlt dir hier einiges an Java-Grundlagen oder allgemein des Programmierens? Darf man fragen, um was für eine Hausaufgabe es sich handelt? Kann es sein, dass es sich beim Fach nicht um Java handelt und dir Grundsätzlich da was fehlt?
 
Wie schon in Posting #4 vermutet, wird dieser Thread jetzt geschlossen.

Aus der hier angepinnten Ankündigung:

Bitte beachtet, hier können Fragen zur Programmierung gestellt werden.
Doch dieses Forum - wie auch alle anderen Bereiche des Forum Computerbase - ist keine Plattform für Hausaufgaben, Tests, Arbeiten, Prüfungen usw.
[...]
Antworten und Hilfen auf entsprechende Fragen sind ebenso unerwünscht.
Bei Zuwiderhandlung können Hinweise und/oder Verwarnungen ausgeschrieben werden.

Haus- und Übungsaufgaben
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben