Commit de073ac9 authored by Christopher Schölzel's avatar Christopher Schölzel 🐃
Browse files

renames "Stack" to "Stakk" to avoid naming conflicts in the JShell and inverts...

renames "Stack" to "Stakk" to avoid naming conflicts in the JShell and inverts iteration order of fromArray, thx N. Korschinsky
parent 6c6dcb12
......@@ -31,12 +31,12 @@ include::{sourcedir}/arrayList.java[]
<2> Der Parameter `E` kann überall auftauchen wo Klassennamen verwendet werden: Als Typ einer Variable oder eines Parameters oder als Rückgabetyp. Natürlich kann man von einem Objekt von einem unbekannten bzw. beliebigen Typ `E` auch nur Methoden aufrufen, die _jedes_ Objekt in Java besitzt - also alles was in der Klasse `Objekt` definiert ist. Für die `ArrayList` reicht das völlig, da mit den Objekten ja nichts anderes geschieht als dass sie in ein Array gesteckt oder wieder aus diesem herausgeholt werden.
<3> Es wirkt etwas seltsam, dass das interne Array nicht vom Typ `E[]` statt vom Typ `Object[]` ist. Es spricht nichts dagegen eine Variable oder ein Feld vom Typ `E[]` zu definieren, aber in Java ist das Erzeugen von generischen Arrays etwas komplizierter. Das hat damit zu tun, dass Typparameter vom Java-Compiler entfernt und durch den Typ `Object` (mit entsprechenden Typcasts an den relevanten Stellen) ersetzt werden.
Für ihre Klasse `Stack` bzw. `Stapel` aus den vorherigen Übungsblättern ist die Situation sogar noch etwas einfacher. Schaffen Sie es analog zu dem Beispiel der `ArrayList` auch einen generischen `Stack` zu bauen, so dass z.B. die folgenden Aufrufe möglich werden?
Für ihre Klasse `Stakk` bzw. `Stapel` aus den vorherigen Übungsblättern ist die Situation sogar noch etwas einfacher. Schaffen Sie es analog zu dem Beispiel der `ArrayList` auch einen generischen `Stakk` zu bauen, so dass z.B. die folgenden Aufrufe möglich werden?
----
Stack<String> stringStack = new Stack<String>("First");
Stakk<String> stringStack = new Stakk<String>("First");
stringStack.push("Second");
Stack<Double> doubleStack = new Stack<Double>(Double.NaN);
Stakk<Double> doubleStack = new Stakk<Double>(Double.NaN);
doubleStack.push(3.5);
double d = doubleStack.pop();
----
......@@ -47,7 +47,7 @@ include::preDetailsSolution.adoc[]
include::{sourcedir}/genericStack.java[]
----
<1> Hier haben wir einen Trick verwendet um unser generisches Array zu erzeugen, der auch in der Methode `toArray` von `ArrayList` zu sehen ist: Wir verlangen vom Benutzer, dass er uns ein Array des korrekten Typs übergibt, damit wir und mit `Arrays.newInstance` ein Array vom gleichen Typ erzeugen können. Man kann die Implementierung noch etwas effizienter machen indem man direkt das übergebene Array zum speichern der Werte verwendet, falls es groß genug ist.
<2> Auch Methoden können eigene Typparameter besitzen. Bei dieser statischen Methode ist das nötig, da bei dem Aufruf von `Stack.fromArray` kein Objekt vom Typ `Stack` beteiligt ist von dem man den Typparameter ableiten könnte.
<2> Auch Methoden können eigene Typparameter besitzen. Bei dieser statischen Methode ist das nötig, da bei dem Aufruf von `Stakk.fromArray` kein Objekt vom Typ `Stakk` beteiligt ist von dem man den Typparameter ableiten könnte.
include::postDetails.adoc[]
== Turing-Maschine
......
class Stack<E> {
class Stakk<E> {
E value;
Stack<E> rest;
Stack(E value, Stack<E> rest) {
Stakk<E> rest;
Stakk(E value, Stakk<E> rest) {
this.value = value;
this.rest = rest;
}
Stack(E value) {
Stakk(E value) {
this(value, null);
}
public String toString() {
......@@ -20,7 +20,7 @@ class Stack<E> {
return 1 + rest.size();
}
void push(E val) {
rest = new Stack<E>(value, rest);
rest = new Stakk<E>(value, rest);
value = val;
}
E pop() {
......@@ -32,17 +32,17 @@ class Stack<E> {
E[] toArray(E[] base) { // <1>
E[] ar = Arrays.copyOf(base, size());
int i = 0;
Stack<E> cur;
Stakk<E> cur;
for(cur = this; cur.rest != null ; cur = cur.rest) {
ar[i++] = cur.value;
}
ar[i] = cur.value;
return ar;
}
static <E> Stack fromArray(E[] ar) { // <2>
Stack<E> s = null;
for(int i = 0; i < ar.length; i++) {
s = new Stack<E>(ar[i], s);
static <E> Stakk fromArray(E[] ar) { // <2>
Stakk<E> s = null;
for(int i = ar.length-1; i >= 0; i--) {
s = new Stakk<E>(ar[i], s);
}
return s;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment