Hallo!!
Ich hatte die Aufgabe eine Stringliste basierend auf Arrays zu erstellen, dessen Größe sich immer verdoppelt, sobald das Array voll ist.
Es galt folgende Klassen zu implementieren:
dafür habe ich folgende datei erstellt:
nun funktioniert die remove methode aber nicht so ganz. denn nach einem remove zählt die count-variable nicht mehr richtig weiter. ich habe folgendes testprogramm, bei dem der fehler auftritt:
???:L???:L???:L Egal wie lange ich suche - ich verstehe nicht, warum die count-variable nicht stimmt.
Ich hatte die Aufgabe eine Stringliste basierend auf Arrays zu erstellen, dessen Größe sich immer verdoppelt, sobald das Array voll ist.
Es galt folgende Klassen zu implementieren:
Java:
public interface StringListIterator{
boolean hasNext(); //true gdw es git ein weiters Element
String getNext(); //liefert naechstes Element; requires hasNext()
}
Java:
public interface StringList {
void add(String s); // fuegt s vorn hinzu
void removeFirst(); // loescht erstes Element; requires nrOfElems > 0
int nrOfElems(); // Anzahl Elemente
StringListIterator giveIterator(); // liefert Iterator; Durchlauf vom ersten zum letzten Element
}
dafür habe ich folgende datei erstellt:
Java:
public class ArrayBasedStringList implements StringList {
// verwendet intern ein array vom Typ String[]
// ---------------------------------------Instanzvariablen
private String[] list;
private int count;
private int n;
// --------------------------------------- Konstruktoren
public ArrayBasedStringList() { // Erzeugung einer leeren Liste mit Array der Länge 10
n = 10;
count = 0;
list = new String[n];
}
// --------------------------------------- Methoden
public void add(String s) { // fügt s vorn hinzu
/** Gehe die gesamte Liste durch. Wenn ein leeres Feld gefunden wurde, wird dort sofort der String abgespeichert und die Schleife abgebrochen. **/
for (int i = 0; i < list.length; i++) {
if (list[i] == null) {
list[i] = s;
count = count+1;
break;
}
/** Wird kein leeres Feld gefunden, ist der Array höchstwahrscheinlich voll. **/
else {
if (i == list.length-1) { // Überprüfung ob wirklich letztes Feld auch voll
String[] help = new String[n];
for (int v = 0; v < help.length; v++) {
help[v] = list[v];
}
int x = n*2;
list = new String[x]; // Erzeugung eines neuen Arrays mit doppelter Länge und Wiederbefüllung
for (int v = 0; v < help.length; v++) {
list[v] = help[v];
}
for (int z = 0; z < list.length; z++) {
if (list[i] == null) {
list[i] = s;
count = count+1;
}
}
}
}
}
}
public void removeFirst() { // löscht erstes Element; requires nrOfElems > 0
if (list[0] != null) { /** wenn im ersten Element was drin steht ist die Liste nicht leer */
for (int i = 0; i < list.length; i++) { // gehe die gesamte Liste durch, wenn das erste leere Feld gefunden wird, wird das vorherige auch auf null gesetzt
if (list[i] == null) {
list[i-1] = null;
count = count-1; // Zähler für Elemente wird um 1 gesenkt
}
}
}
else {
System.out.println ("Liste ist leer");
}
}
public int nrOfElems() { // Anzahl Elemente
return count;
}
public StringListIterator giveIterator() { // liefert Iterator, Durchlauf vom ersten zum letzten Element
return new Iterator();
}
// ------------------------ inere Klasse für Iterator
private class Iterator implements StringListIterator {
int zaehler;
Iterator() { /** Konstruktor **/
zaehler = 0;
}
public boolean hasNext() {
if (zaehler < list.length-1) {
return list[zaehler+1] != null;
}
else {
return false;
}
}
public String getNext() {
String result = list[zaehler]; // String wird abgespeichert
zaehler++;
return result; // String wird ausgegeben
}
}
}
nun funktioniert die remove methode aber nicht so ganz. denn nach einem remove zählt die count-variable nicht mehr richtig weiter. ich habe folgendes testprogramm, bei dem der fehler auftritt:
Java:
class Bsp02 {
public static void main(String[] arg) {
ArrayBasedStringList liste2 = new ArrayBasedStringList();
liste2.add("abc");
liste2.add("def");
liste2.add("ghi");
liste2.add("jkl");
liste2.add("mno");
liste2.add("pqr");
liste2.add("stu");
liste2.add("vwx");
liste2.add("yz");
System.out.println("Anzahl der Elemente: 9");
System.out.println("Kontrolle: " + liste2.nrOfElems());
StringListIterator Iterator2 = liste2.giveIterator();
if (Iterator2.hasNext()) {
do {
System.out.println(Iterator2.getNext());
}
while (Iterator2.hasNext());
}
System.out.println(Iterator2.getNext()); // Fehlerbehebung weil hasNext() einmal zu wenig funktioniert
liste2.removeFirst();
liste2.add("a");
liste2.add("b");
liste2.add("c");
liste2.removeFirst();
liste2.add("d");
liste2.add("e");
liste2.add("f");
System.out.println("Anzahl der Elemente: 13");
System.out.println("Kontrolle: " + liste2.nrOfElems());
StringListIterator Iterator21 = liste2.giveIterator();
if (Iterator21.hasNext()) {
do {
System.out.println(Iterator21.getNext());
}
while (Iterator21.hasNext());
}
System.out.println(Iterator21.getNext()); // Fehlerbehebung weil hasNext() einmal zu wenig funktioniert
}
}
???:L???:L???:L Egal wie lange ich suche - ich verstehe nicht, warum die count-variable nicht stimmt.