importieren von selbst definierten klassen

  • Themenstarter Themenstarter joe7210
  • Beginndatum Beginndatum
J

joe7210

Gast
hallo,

ich habe eine kurze frage:

ich muss in meinem demoprogramm dem konstruktor einen stringnode übergeben.
ich habs so versucht:

String abc;
StringNode xyz = new StringNode(abc);
LinkedStringList ghi = new LinkedStringList(xyz);

aber dann schreit der compiler: "cannot find variable stringnode".
wie kann ich das problem lösen?

Java:
private StringNode list;

public LinkedStringList(StringNode n){
	list = n;
	counter = 1;
	}

private class StringNode{
		String data;
		StringNode link;
		StringNode(){}
		StringNode(String s, StringNode n){
			data = s;
			link = n;
		}
	}
 
aber was mir grad auffällt ..

Java:
String abc;
StringNode xyz = new StringNode(abc);
LinkedStringList ghi = new LinkedStringList(xyz);

du rufst nen Konstruktor der StringNode-Klasse auf, der gar nicht existiert .. weiterhin stellt sich die Frage, wo diese Zeilen ausgeführt werden => mehr Code nötig
 
das ist der code der gesamte klasse:
Java:
public class LinkedStringList implements StringList{

	private StringNode list;
	private int counter = 0;
	
	public LinkedStringList(){
	}	
	public LinkedStringList(StringNode n){
	list = n;
	counter = 1;
	}	
	public void add(String s){
		list = new StringNode(s,list);
		counter++;
	}	
	public void removeFirst(){
		list = list.link;
		counter--;
	}	
	public int nrOfElems(){
		return counter;
	}
	private class StringNode{
		String data;
		StringNode link;
		StringNode(){}
		StringNode(String s, StringNode n){
			data = s;
			link = n;
		}
	}
}
und hier das demoprogramm:
Java:
public class Bsp02{
	public static void main(String[] args){
	
	String choice;
	String wort;
	
	int size;
	char wahl;
	
	System.out.println("Geben Sie die Art(linked, array) der Liste an, die Sie erstellen wollen.");
	choice = SavitchIn.readLine();
	if(choice == "linked"){
		System.out.println("Geben Sie die ersten Inhalt der Liste ein.");
		wort = SavitchIn.readLine();
		StringNode inhalt = new StringNode(wort);
		LinkedStringList mylist = new LinkedStringList(inhalt);		
	do{	
		System.out.println("Was wollen Sie als nächstes machen?");
		System.out.println("Inhalt (h)izufuegen.");
		System.out.println("Inhalt (r)eduzieren.");
		System.out.println("Inhalt (a)nzeigen.");
		System.out.println("Anzahl der Elemente an(z)eigen.");
	
		wahl = SavitchIn.readLineNonwhiteChar();
	
		if(wahl == 'h'){
			System.out.println("Geben Sie den zu hinzufuegenden Inhalt ein.");
			String word = SavitchIn.readLine();
			mylist.add(word);
		}
		else if(wahl == 'r')
			mylist.removeFirst();
	
		//else if(wahl == 'a')
			//mylist.giveIterator();
	
		else if(wahl == 'z')
			mylist.nrOfElems();
	}
	while(wahl == 'h' || wahl == 'r' || wahl == 'a' || wahl == 'z');
	}
	
}

die fehlermeldung: sorry, es war nicht variable sondern symbol, das er nicht gefunden hat:

cannot find symbol
symbol: class stringnode
location: class bsp02
stingnode inhalt = new stringnode(wort);

ich merk selbst grad, dass die fehlermeldung wegen des nicht vorhandenen konstruktors kommt, allerdings weiß ich nicht, wie ich sonst dem anderen konstruktor einen stringnode übergeben könnte.
 
generell würde ich ein derartiges vorgehen empfehlen:

die Liste als solches weiss am besten wie sie ihre Daten speichern möchte, in deinem Fall mit Hilfe von StringNode-Objekten. Die Klasse private innerhalb der Klasse LinkedStringList zu deklarieren ist dazu völlig in Ordnung, denn nirgendwo sonst brauchst du einen Zugriff auf diese Klasse. Wenn du nun Daten in der Liste ablegen willst, so brauchst du auch nur diese Daten und keine Objekte, welche die Daten beinhalten (StringNode), an die Liste übergeben. Die Liste packt diese Daten selbstständig in ein StringNode-Objekt.

Somit fallen alle StringNode-Referenzen ausserhalb der Listenklasse weg. Die Liste stellt lediglich Methoden bereit mit denen du die Daten hinzufügen, löschen, .. kannst. In deinem Fall wären das einfache String-parameter.

Die Liste ist anfangs leer, das bedeutet du benötigst auch nicht zwingend einen Konstruktor der die ersten Daten erhält. Mittels der üblichen add-Methode wird die Liste gefüllt.

Ist natürlich nun die Frage, welche Vorgaben du einhalten sollst (interface StringList, oder dergleichen)
 
Zuletzt bearbeitet:
ok, dann nehm ich nur den default-konstruktor.

das ist die vorgabe:

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
}

public interface StringListIterator {
boolean hasNext(); // true gdw es git ein weiters Element
String getNext(); // liefert naechstes Element; requires hasNext()
}

dann hab ich noch ne frage zu dem stringlistiterator.

im ersten interface wird der ja gefordert. jetzt hab ich nur das problem, dass ich ja für das zweite interface die methoden in einer eigenen klasse definieren muss. allerdings kennt der compiler ja die liste nicht, die ich in der klasse für das erste interface definiert habe.

tut mir leid für die trivialen fragen, aber wir haben erst vor kurzem mit dem interfaces angefangen und ich kenn mich deswegen nicht so gut damit aus 🙂
 
den iterator kannst du genauso wie deine StringNode-Klasse als private Klasse einbinden, damit hat sie Zugriff auf nötige Elemente

Java:
public class LinkedStringList implements StringList {
 
    ...

    private class StringNode {

        ...
    }

    private class LinkedStringListIterator implements StringListIterator {
    
        ...
    }
}
 
ok. eine letzte frage noch:

was geb ich der methode "giveIterator" als return-wert?

Java:
public StringListIterator giveIterator(){
		//return ???;
	}
	
	private class Iterator implements StringListIterator{
	
		public boolean hasNext(){
		if(counter != 0){
		do{list = list.link;
		}
		while(list.link != null);
			return list == null;
		}
		else
			return list == null;
		}
		
		public String getNext(){
			while(hasNext())
				return list.data;
		}
	}
 
oh, ich seh grad, dass meine bool'sche variable den falschen rückgabewert für die methode "hasNext" gibt.

aber das ändert ja nix an der frage.
 
also ich würde die Klasse nicht Iterator nennen, da es bereits ein interface in java gibt, was so heisst.

an sich würde die methode so aussehen
Java:
public StringListIterator giveIterator() {
    return new LinkedStringListIterator();
}

innerhalb der Iterator-Implementierung hast du dann alles weitere, was nötig ist.

generell:

hasNext: schaut nach ob dem aktuellen Datenelement noch ein weiteres folgt

getNext: liefert genau das folgende Datenelement

da sind keine schleifen nötig
 

Zurück
Oben