Behöver hjälp med java skoluppgift. Stack, Interfaces och Iterator.

Permalänk
Medlem

Behöver hjälp med java skoluppgift. Stack, Interfaces och Iterator.

Hej samtliga!

Jag är en som studerar till att få ut en kandidatexamen på Lnu i Kalmar, har tidigare läst ett program här som var riktat till att bli it/nätverkstekniker. De hade ett tillvalsår för att få ut en kandidatexamen i Datavetenskap dock p.g.a personalbrist etc så sitter jag nu med kurser i programmering och Java. Skulle behöva hjälp med den sista uppgiften jag har kvar i denna javakurs, antagligen mest förståelse av uppgiften.

Uppgiften följer nedan

En stack är en LiFo (Last-in, first-out) datastruktur med tre operationer: push, pop och peek. Push lägger in ett element överst på stacken, pop tar bort och returnerar det översta elementet, och peek returnerar (utan att ta bort) det översta elementet. Namnet "stack" kommer från engelskan och betyder "hög" eller "stapel". Stacken kan liknas med en tallriksstapel som kan påträffas i en skolbespisning eller lunchrestaurang. På stapeln kan man endast lägga en tallrik eller ta bort den översta – det går inte att ta bort en tallrik från mitten av stapeln. Er uppgift är att implementera följande Stack interface:

public interface Stack { int size(); // Current stack size boolean isEmpty(); // True if stack is empty void push(Object element); // Add element at top of stack Object pop(); // Return and remove top element // exception if stack is empty. Object peek(); // Return (without removing) top element, // exception if stack is empty. Iterator iterator(); // Element iterator }

Iteratorn itererar över alla stackens element. Skriv också ett testprogram StackMain.java som visar hur alla metoder fungerar. Notera: Ni får inte använda några av de fördefinerade klasserna i Javas klassbibliotek. Ni får dock använda arrayer.

Dold text

Det jag har gjort är att skapa 3 java klasser, Stack.java som innehåller interfacet som var fördefinierat.
StackImpl där jag implementerar samtliga av de abstrakta metoderna denna ser ut såhär just nu.

package test.stack import java.util.EmptyStackException; public class StackImpl< Object > implements Stack{ private Tallrik tallrikar; private int size = 0; StackImpl(){ tallrikar = null; size = 0; } public int size() { return size; } public boolean isEmpty() { return ( size == 0 ); } public Object pop() { if(isEmpty()){ throw new EmptyStackException(); } Object data = tallrikar.data; tallrikar = (TallriksHoegTyp<Object>.Tallrik) tallrikar.next; size --; return data; } public Object peek() { if(isEmpty()){ throw new EmptyStackException(); } return tallrikar.data; } public Iterator iterator() { for(int x=0;x<this.size;x++){ pop(); } } private class Tallrik{ protected Object data; protected java.lang.Object next; public Tallrik( Object element ){ this.data = element; this.next = null; } } public void push(Object element) { Tallrik newTallrik = new Tallrik( element ); newTallrik.next = (Object) tallrikar; tallrikar = newTallrik; size++; } }

Dold text

Samt den simpla StackMain.java som antagligen inte är så viktig i sammanhanget, där jag endast pushar två objekt (en string och en int), samt poppar den ena, då översta..

Då detta inte var en korrekt lösning av problemet, iterator är exempelvis inte implementerat alls, så har jag fått lite respons på vad som var fel.
Det är mest dessa jag behöver hjälp med att förstå.

  • Tanken är inte att din implementation av stack ska innehålla statiska metoder.

  • Din konstruktor saknar synlighet

  • Du ska inte använda en egen datatyp för att spara objekten, det är nämligen en länkad lista som gör det. En vanlig array används av typen Objekt.

  • iterator(): saknas. ex på hur den skall användas i main(): Iterator<Object> it = myStack.iterator(); och sedan skall hasNext() och next() användas.. iterator() -metoden returnerar alltså en instans av en Iterator-klass som ska skapas inuti Stack-klassen. Denna Iterator-klass implementerar ett interface i Java som heter Iterator.

Det jag antar från denna respons är att jag skall i min StackImpl klass ska ha en array som "klassvariabel(?)", och därmed använder jag inte någon egen datatyp utan använder en Object[] istället..

Och iterator, ingen aning om vad och hur jag skall börja på den. Har dock en aning om hur den skall användas senare i main(), då responsen innehöll detta men icke om hur den skall implementeras i antagligen StackImpl ...

Tack i förväg för samtliga som tar sig tid att åtminstone läsa mitt långa inlägg trots att jag skriver som en kratta...

Permalänk
Medlem

Har nu bytt ut mina egna objekt "tallrikar" mot en array och lösningen ser ut såhär just nu, skulle behöva hjälp med förståelse om hur Iterator kan implementeras, har googlat runt utan att hitta något nybörjarvänligt...

StackImpl.java

package test.stack; import java.util.EmptyStackException; import java.util.Iterator; public class StackImpl implements Stack{ private Object[] arr; private int size = 0; StackImpl(){ this.arr = new Object[8]; } public int size() { return size; } public boolean isEmpty() { return ( size() == 0 ); } public Object pop() { if(isEmpty()){ throw new EmptyStackException(); } Object tmp = arr[size()-1]; arr[size()-1] = null; size --; return tmp; } public Object peek() { if(isEmpty()){ throw new EmptyStackException(); } return arr[size()-1]; } private void expand(){ Object[] tmpArr = arr.clone(); this.arr = new Object[arr.length*2]; for (int i = 0; i < tmpArr.length; i++){ arr[i] = tmpArr[i]; } } public void push(Object element) { if (size() == this.arr.length){ expand(); } arr[size] = element; size++; } @Override public Iterator iterator() { // TODO Auto-generated method stub return null; } }

Dold text
Permalänk
Medlem

Förmodligen är inte detta lösningen till iterator, men av den beskrivningen som du har fått vill jag försöka ge lite kött till benet :-).

Vill du gå igenom alla element i din lista kan du skriva.

For (Array arr : minLista) { System.out.println(arr); }

Koden går igenom din lista av element och printar varje värde som finns i din lista. Nu säger jag inte att detta är en lösning, och det jag inte förstår är om iterator bara ska gå igenom listan och printa ut allt eller om du får nästa element när du anropar iterator.

Permalänk
Medlem
Skrivet av Razki:

Förmodligen är inte detta lösningen till iterator, men av den beskrivningen som du har fått vill jag försöka ge lite kött till benet :-).

Vill du gå igenom alla element i din lista kan du skriva.

For (Array arr : minLista) { System.out.println(arr); }

Koden går igenom din lista av element och printar varje värde som finns i din lista. Nu säger jag inte att detta är en lösning, och det jag inte förstår är om iterator bara ska gå igenom listan och printa ut allt eller om du får nästa element när du anropar iterator.

Jomen precis dock så antar jag att det som skall returneras skall vara ett Iterator objekt(?).. Men jag löste det typ antar jag? Min lösning är typ såhär;
Skapar en ny klass som skapar en iteratorklass som implementerar Iterator med <Object>

test.stack; import java.util.Iterator; public class StackIterator implements Iterator<Object> { protected Object[] data; protected int index = 0; StackIterator(Object[] data, int index){ this.data = data.clone(); this.index = index; } @Override public boolean hasNext() { return (index > 0); } @Override public Object next() { if (hasNext()) { return data[index--]; } throw new IndexOutOfBoundsException("Det finns inga element mer att iterera..."); } }

Dold text

Skrev i StackImpl denna metod..

public Iterator iterator() { Iterator<Object> iteratorObj = new StackIterator(arr, size-1); return iteratorObj; }

Dold text

Med detta fungerar .next() och hasNext() som verkar vara viktiga delar vid implementation av iteratorn klassen(?). Antar att detta kommer vara min sista version på koden då jag tror att den gör det jag vill. Ni får gärna kolla så att jag inte gör något gigantiskt misstag i koden..

Permalänk
Medlem

Blir det inte ett problem när du implementerar iterator klassen?

"Ni får inte använda några av de fördefinerade klasserna i Javas klassbibliotek"

Permalänk
Medlem

https://gist.github.com/anonymous/3e8aa8019e3159486209

Är fett trött men tror det är något i den här stilen?? Rätt så fula exceptions men skitsamma det kan du ju fixa. några saknas också

Visa signatur

i7 920 @ 3.78ghz 1.2vcore | Asus Rampage II Extreme | HD4870X2 2GB DDR5 | Corsair Dominator DHX+ DDR3 1600MHz 6GB @ 1754Mhz 1.65v | NB Freq 3500Mhz @ 1.35v

Permalänk
Medlem
Skrivet av Morphy:

https://gist.github.com/anonymous/3e8aa8019e3159486209

Är fett trött men tror det är något i den här stilen?? Rätt så fula exceptions men skitsamma det kan du ju fixa. några saknas också

Egentligen borde man använda gamla Enumeration<> då den inte kräver remove()

Visa signatur

Kom-pa-TI-bilitet