Array - String - Liste

misaki

Mitglied
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:

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.
 

jgh

Top Contributor
die count variable stimmt deswegen nicht, weil du in der Methode removeFirst nur einmal die count-Variable dekrementieren darfst (du willst ja auch nur ein Element löschen), du hast allerdings den Code in der for-Schleife...da hat er nichts zu suchen :)

wenn du also die removeFirst-Methode wie folgt abänderst...sollte es klappen:

Java:
	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;
					
				}
			}
			// Zähler für Elemente wird um 1 gesenkt
			count = count - 1;
		} else {
			System.out.println("Liste ist leer");
		}
	}
 

misaki

Mitglied
Ich glaub das ist schon okay so mit dem letzten Element löschen - es ist ja auch eine Frage des Aufbaus der Liste ;))

Habe nun auch noch ein break eingesetzt - immerhin braucht er nicht die restlichen Elemente die ohnehin schon null sind noch auf null setzen.

Aber das mit count passt immer noch nicht - jetzt bekomme ich -5???

Java:
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;
					break;
				}
			count = count-1; // Zähler für Elemente wird um 1 gesenkt
			}
		} 
		else {
			System.out.println ("Liste ist leer");
		}
	}
 

misaki

Mitglied
achja, was bin ich doof - danke! :D

hab die aufgabe nun abgegeben und bei der automatischen überprüfung folgende fehlermeldung erhalten:???:L

Java:
> java -classpath '/home/project/tutorien/algodat/tmp/check-5-3-1300732663' -Duser.language=EN -Duser.region=US -Xmx512M Tester

Exception in thread "test" java.lang.Exception: ArrayBasedStringList: failed to retrieve data from iterator
at test.run(Unknown Source)

leider habe ich auf deren test datei keinen zugriff und weiß so nicht, was denn da gemacht wird :/ Aber angeblich stimmt wohl was mit dem Iterator nicht - hilfe???:bahnhof:
 

misaki

Mitglied
ich tippe ja darauf, dass es was damit zu tun hat, dass ich auch manuell noch einmal getNext() ausführen muss weil bei hasNext() einmal zu wenig durchgeführt wird, oder so :/

aber ich komm einfach nicht auif nen fehler:noe:
 

slawaweis

Bekanntes Mitglied
@misaki
Du hast Dir das Leben unnötig schwer gemacht. Die removeFirst() ist zugegeben zwar eine schöne Falle, aber keine auf die man reinfallen sollte. Wenn Du die Elemente in umgekehrter Reihenfolge abgespeichert hättest, hättest Du keine Probleme mehr. StringList ist nach dem Last-In-First-Out Prinzip definiert, ähnlich wie ein Stack. D.h. add() fügt an der Position count++ das Element hinzu, falls die Liste groß genug wäre, ansonsten Array vergrößern. removeFirst() entfernt count-1. Der Iterator iteriert von hinten nach vorne. Das war es. Zu Verdeutlichung:

Java:
 public void add(String s)
  {
  if(count >= list.length)
    {
    // Array vergrößern
    }
  list[count++] = s;
  }

 public void removeFirst()
  {
  if(count < 1)
    {
    // Ausnahmebehandlung
    }
  count--;
  }

 public int nrOfElems()
  {
  return count;
  }

Der Iterator ist ähnlich trivial. Abhängig davon, wie gut der Test des Dozenten ist, kann man dabei in eine weitere Falle kommen. Dein Iterator iteriert über das originale Array. Wenn dazwischen Änderungen an der Liste passieren, kann es zu einem Fehler führen. Deshalb würde ich empfehlen in der Iterator Implementierung am Anfang das Array zu kopieren.

Slawa
 

misaki

Mitglied
Wär ja wirklich viel leichter gegangen - naja :D Sowas fällt einem meist nicht auf.

Aber das mit dem Iterator versteh ich noch nicht ganz - was soll ich da ändern?
 

slawaweis

Bekanntes Mitglied
Beispiel:

Java:
        ArrayBasedStringList list = new ArrayBasedStringList();
        list.add("abc");
        list.add("def");
        list.add("ghi");
        StringListIterator it = liste.giveIterator();
        if(it.hasNext())
         {
         liste.removeFirst();
         liste.removeFirst();
         liste.removeFirst();

         // Was passiert jetzt?
         it.getNext();
         }

deshalb wäre es von Vorteil für jeden Iterator eine Kopie des Arrays anzulegen oder eben im Iterator aufzupassen, wenn das originale Array geändert wurde. Die erste Möglichkeit ist einfacher.

Slawa
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Mehrdimensionalles Array in String ausgeben in Liste Java Basics - Anfänger-Themen 5
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
R Ein Multidimensionales String Array initialisieren und Deklarieren Java Basics - Anfänger-Themen 2
H Überprüfen ob String Array leer ist Java Basics - Anfänger-Themen 4
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
P Datentypen Array und String Java Basics - Anfänger-Themen 2
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
F Auto String mit Array Name aus Datei... oder so ähnlich Java Basics - Anfänger-Themen 4
J String aus einem Array entfernen Java Basics - Anfänger-Themen 10
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
FelixN RegEx aus einem String als String-Array zurückgeben Java Basics - Anfänger-Themen 8
Curtis_MC 2dimensionales Array als String ausgeben Java Basics - Anfänger-Themen 2
I char Array to String Java Basics - Anfänger-Themen 3
I converting boolean Array to String Array Java Basics - Anfänger-Themen 10
M String array durch Eingabe begrenzen Java Basics - Anfänger-Themen 7
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
scratchy1 Array sortieren und dann String-Repräsentation ausgeben Java Basics - Anfänger-Themen 2
E Array to String Method Reverse Java Basics - Anfänger-Themen 5
Mosquera Get String Array - ComboBox Java Basics - Anfänger-Themen 10
P Strings in String Array schreiben Java Basics - Anfänger-Themen 13
V zweidimensionale String Array Java Basics - Anfänger-Themen 1
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
M Array nach String durchsuchen und zurückgeben Java Basics - Anfänger-Themen 16
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
C Methoden String in char Array Java Basics - Anfänger-Themen 3
T Schauen ob eine Ziffer in einem String-Array häufiger vorkommt Java Basics - Anfänger-Themen 8
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
N String array to String Java Basics - Anfänger-Themen 6
informatikschüler21 String im Array sortieren Java Basics - Anfänger-Themen 4
B String in Array speichern Java Basics - Anfänger-Themen 4
L String zu String Array Java Basics - Anfänger-Themen 2
D Input/Output Array in einem String mit einem Trennzeichen verbinden Java Basics - Anfänger-Themen 17
D String-Array Java Basics - Anfänger-Themen 3
V String Array gegen null-Eintrag sichern Java Basics - Anfänger-Themen 11
K String in String-Array suchen Java Basics - Anfänger-Themen 11
K String Array basierend auf int Array füllen Java Basics - Anfänger-Themen 2
K Im String Array suchen Java Basics - Anfänger-Themen 8
D Elements[] string = document.getElementsByClass("betEvent"); als Array Java Basics - Anfänger-Themen 1
C Array in String umwandeln Java Basics - Anfänger-Themen 5
D Best Practice String aufbau - Char Array oder Anhängen Java Basics - Anfänger-Themen 11
M String Array mischen Java Basics - Anfänger-Themen 3
F Methoden Kontaktliste - String in einem Array suchen und ausgeben Java Basics - Anfänger-Themen 3
K String zu int Array Java Basics - Anfänger-Themen 3
B String auslesen und Stellen im Array speichern Java Basics - Anfänger-Themen 1
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
W String Array in Int umwandeln um auf Zahl zu überprüfen Java Basics - Anfänger-Themen 4
W Array nach String durchsuchen und Ausgeben Java Basics - Anfänger-Themen 8
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
K String in String-Array finden Java Basics - Anfänger-Themen 7
S Rückgabe-Array lässt sich nicht auslesen, LocalDate mit String Java Basics - Anfänger-Themen 3
J 2 String Arrays in neuem String Array verbinden Java Basics - Anfänger-Themen 4
S String zu quadratischen Array Java Basics - Anfänger-Themen 3
T Array mit String, Zahlen in If Saetze packen Java Basics - Anfänger-Themen 3
J Int Array und String in einer neuen Methoder übergeben Java Basics - Anfänger-Themen 7
S ArrayDeque zu String Array Java Basics - Anfänger-Themen 2
A Variablen String Array in einzelne Strings auspalten Java Basics - Anfänger-Themen 4
K Input/Output 6000 Zeilen einlesen und String-Array vergleichen? Java Basics - Anfänger-Themen 1
fLooojava String zu Array Java Basics - Anfänger-Themen 5
C Array List mit String vergleichen und Fehlermeldung ausgeben Java Basics - Anfänger-Themen 6
J array in String umwandeln Java Basics - Anfänger-Themen 1
J array in String umwandeln Java Basics - Anfänger-Themen 3
E Erste Schritte Array soll kleiner werdenden String erstellen Java Basics - Anfänger-Themen 5
D String-Array aus Tastatureingabe Java Basics - Anfänger-Themen 4
L String array mit split füllen Java Basics - Anfänger-Themen 14
P Datentypen String auf JTextField wird zu Char-Array und anschließend zu int Java Basics - Anfänger-Themen 12
A private string array Java Basics - Anfänger-Themen 5
W String / Int-Array Java Basics - Anfänger-Themen 13
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
T Sortieren/Suche klappt nicht ganz (String Array) Java Basics - Anfänger-Themen 2
B Werte über Scanner in ein 3 dim String Array schreiben Java Basics - Anfänger-Themen 7
T String in Array suchen Java Basics - Anfänger-Themen 9
G String einem String Array übergeben Java Basics - Anfänger-Themen 3
G String to Array Java Basics - Anfänger-Themen 2
P CSV Datei in String Array -> Split -> New Array Java Basics - Anfänger-Themen 2
U OOP Array vom Typ String > Inhalt ausgeben Java Basics - Anfänger-Themen 8
F Variablen String-Array wird ungewollt "überschreiben" Java Basics - Anfänger-Themen 7
J Zeichen aus String Array lesen Java Basics - Anfänger-Themen 13
S Länge eines Elements im String Array Java Basics - Anfänger-Themen 5
F Problem: Verschlüsselung von String in Array Fehler Java Basics - Anfänger-Themen 2
C Datentypen Zweidimensionales Array mit String und int Java Basics - Anfänger-Themen 3
J Array zu String Java Basics - Anfänger-Themen 13
B String Array in main() Java Basics - Anfänger-Themen 2
G String Array konvertieren in Integer Array? Java Basics - Anfänger-Themen 7
Junb String in Array speichern Java Basics - Anfänger-Themen 4
J Einem String-Array in einer for-Schleife Strings zuweisen - Klappt nicht in einer for-Schleife Java Basics - Anfänger-Themen 5
P String Sortieren in einem Array Java Basics - Anfänger-Themen 7
W String & Integer im Array Java Basics - Anfänger-Themen 7
C Datentypen int array in String ausgeben Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben