Falsche Augabe

Status
Nicht offen für weitere Antworten.

Veghana

Mitglied
[Java]class BinaerBaum {
BinaerBaum links; //linker Teilbaum
BinaerBaum rechts; //rechter Teilbaum
int wert;
String result;
BinaerBaum (int wert){
this.wert=wert;

}
public void add(int zahl){
if(zahl<= wert){
if(links==null){
links= new BinaerBaum(zahl);
}
else links.add(zahl);
}
else {
if (rechts==null){
rechts= new BinaerBaum(zahl);
}
else rechts.add(zahl);
}
}
public String toString(){

if (links != null){
result+=links.toString();
}
result+=wert;
if (rechts !=null){
result+=rechts.toString();
}
return result;
}
}
public class TestBaum{
public static void main(String[] args) {
BinaerBaum eins=new BinaerBaum(10);
eins.add(3);
eins.add(2);
eins.add(1);
eins.add(11);
eins.add(12);
System.out.println("<" +eins.toString()+ ">");
}
}[/Java]

Das sind meine beiden Klassen. Wenn ich jetzt TestBaum ausführe, bekomme ich die Ausgabe "nullnullnullnull12310null11null12" obwohl ich doch ausdrücklich definiert habe, es soll die Werte von links und rechts nur in result speichern wenn sie ungleich null sind. Wo liegt da der Fehler?
 
S

SlaterB

Gast
erkennst du deinen Fehler in folgendem Programm?:
Java:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {

        Object a = new Object();
        String aToString = null;

        String c = null;
        if (a != null)
        {
            c += aToString;
        }
        System.out.println(c);
    }


}
Ausgabe:
nullnull
 

Veghana

Mitglied
Mmh,
also ich verstehe noch nicht ganz warum zweimal null ausgegeben wird. Du sagst doch falls a != null ist, soll er a dazu addieren. Das ist nicht der fall, also bleibt c wie es ist, und c ist nunmal null. Warum wird also 2mal null ausgegeben?
 
S

SlaterB

Gast
a ist nicht null so wie die Blätter in deinen Bäumen, a ist hier new Object()

von nicht-null Objeken wird das toString() zusammenaddiert, das toString() ist aber meistens null

edit:
oder doch nicht, die Blätter sind wohl ok, aber weiter oben wird immer null+String gerechnet, und da kann aben null1 rauskommen
 
Zuletzt bearbeitet von einem Moderator:

Veghana

Mitglied
Ok, hab das Problem gelöst. Der Fehler war, dass result als Null definiert war. mit Änderung der Zeile
String result; in String result=""; ist alles in Ordnung.

Danke für deine Hilfe
 

Veghana

Mitglied
Ok, ich hab nochmal ein weiteres Problem mit dem Quellcode.

Jetzt will ich die Methode countNode() einführen, welche mir die Anzahl der Knoten wiedergibt:

Java:
class BinaerBaum {
	BinaerBaum links; //linker Teilbaum
	BinaerBaum rechts; //rechter Teilbaum
	int wert;
	int anzahl=1;
	String result ="";
	BinaerBaum (int wert){
		this.wert=wert;
		
	}
	public void add(int zahl){
		if(zahl<= wert){
			if(links==null){
				links= new BinaerBaum(zahl);
			}
		else links.add(zahl);
	}
	else {
		if (rechts==null){
			rechts= new BinaerBaum(zahl);
		}
		else rechts.add(zahl);
	}
}
	public String toString(){
		
		if (links != null){
			result+=links.toString();
			}
			result+=wert;
		if (rechts !=null){
			result+=rechts.toString();
		}
		return result;
	}
	public int countNode(){
		if (links!=null){
			anzahl+=1;
			links.countNode();
		}
		if (rechts!=null){
			anzahl+=1;
			rechts.countNode();
		}
		return anzahl;
	}
}
public class TestBaum{
	public static void main(String[] args) {
		BinaerBaum eins=new BinaerBaum(10);
		eins.add(3);
		eins.add(2);
		eins.add(1);
		eins.add(11);
		eins.add(12);
		System.out.println("<" +eins.toString()+ ">");
		System.out.println("Knotenanzahl: " +eins.countNode());
	}
}

Wenn ich die jetzt aber ausgebe, sagt er mir ich hab 3 Knoten, und nicht wie es sein sollte sechs. Dabei sollte er mir doch durch die Rekursion alle Knoten angeben, warum funktioniert das trotzdem nicht?
 

Leroy42

Top Contributor
Ich würde keine statische Variable "anzahl" verwenden, da sie dein
gesamtes Konzept verändert und eine Instanzvariable zu nehmen
ist noch chaotischer! :eek:

Schreib' deine Methode doch einfach rein-rekursiv!

Java:
    public int countNode() {
      return 1 + (links==null ? 0:links.countNode()) + (rechts==null ? 0:rechts.countNode())
    }
}
:D
 
Zuletzt bearbeitet:
S

SlaterB

Gast
anzahl ist hier ja auch nicht statisch,
Problem ist, dass der Rückgabewert von z.B. links.countNode(); nicht berücksichtigt wird,
der muss zur Anzahl dazu, dafür kann das
anzahl+=1;
im Falle von links/ rechts != null weg, das ist bei links.countNode(); usw. schon mit drin
 

Leroy42

Top Contributor
Nochmal erklärt wieso deine Lösung falsch war:

1. werden Instanzvariablen durch Aufruf von countNode() verändert.
Dadurch würden weitere Aufrufe von countNode() diese Variable(n) auch
mehrfach erhöhen.

2. wird pro Instanz eine neue Variable "anzahl" erzeugt was nun wirklich unnötig ist

3. wird auf jeder Rekursionsstufe eine andere Variable erhöht
 

Veghana

Mitglied
Ok, hab noch eine weitere Frage. Ich hab das Programm jetzt auf Generics umgeschrieben. dabei gibt er mir aber nicht die Knoten aus, sondern nur leere Klammern, kann mir jemand sagen warum?

[Java]class BinaerBaum <T extends Comparable> {

BinaerBaum links; //linker Teilbaum
BinaerBaum rechts; //rechter Teilbaum
T wert;
String result ="";
int res;
BinaerBaum (T wert){
this.wert=wert;

}
public void add(T element){
res=this.wert.compareTo(element);
if(result<=0){
if(links==null){
links= new BinaerBaum(element);
}
else links.add(element);
}
if(result>0){
if (rechts==null){
rechts= new BinaerBaum(element);
}
else rechts.add(element);
}
}

public String toString(){
if (links != null){
result+=links.toString();
}
result+=wert;
if (rechts !=null){
result+=rechts.toString();
}
return result;
}
public int countNode(){
return 1 + (links==null ? 0:links.countNode()) + (rechts==null ? 0:rechts.countNode());
}
}
public class TestBaum <T>{
public static void main(String[] args) {
String c=new String ("");
String a=new String ("");
String b=new String ("");
BinaerBaum eins=new BinaerBaum(c);
eins.add(a);
eins.add(b);
System.out.println("<" +eins.toString()+ ">");
System.out.println("Knotenanzahl: " +eins.countNode());
}
}[/Java]
 
G

Gelöschtes Mitglied 5909

Gast
weil "" nunmal leer ist?

und mach

Java:
BinaerBaum<T> links; //linker Teilbaum
    BinaerBaum<T> rechts; //rechter Teilbaum
 

Veghana

Mitglied
Na, da hätte ich ja auch wirklich selber drauf kommen können.

Jetzt gibt der mir zwar Werte aus, aber immer wiederholende und dann noch in der falschen Reihenfolge. Ich will alle die kleiner oder gleich sind, nach links einordnen, alle die größer sind (oder wie hier später im alphabet kommen) rechts.

Wenn ich jetzt aber diese Klassen habe:
[Java]class BinaerBaum <T extends Comparable> {

BinaerBaum<T> links; //linker Teilbaum
BinaerBaum<T> rechts; //rechter Teilbaum
T wert; //wurzel
int res=wert.compareTo(element);
BinaerBaum (T wert){
this.wert=wert;

}

public void add(T element){

if(res<=0){
if(links==null){
links= new BinaerBaum<T> (element);
}
else links.add(element);
}
if(res>0){
if (rechts==null){
rechts= new BinaerBaum<T> (element);
}
else rechts.add(element);
}
}

public String toString(){
String result=new String ("");
if (links != null){
result+=links.toString();
}
result+=wert;
if (rechts !=null){
result+=rechts.toString();
}
return result;
}
public int countNode(){
return 1 + (links==null ? 0:links.countNode()) + (rechts==null ? 0:rechts.countNode());
}
}
´public class TestBaum <T>{
public static void main(String[] args) {
String a=new String ("a");
String b=new String ("b");
String c=new String ("c");
BinaerBaum eins=new BinaerBaum(b);
System.out.println("<" +eins.toString()+ ">");
eins.add(c);
System.out.println("<" +eins.toString()+ ">");
eins.add(a);
System.out.println("<" +eins.toString()+ ">");

}
}[/Java]

Dann bekomm ich die Ausgabe:
<b>
<bcb>
<bcbcba>

Irgendwie scheint das an meiner Ausgabe Variablen zu liegen, die verändert wird, obwohl ich nicht verstehe, warum die Sortierung (bzw. die Ausgabe Reihenfolge) nicht funktioniert.

Kann mir da jemand helfen?
 
S

SlaterB

Gast
dein Code stimmt so nicht, Zeile 6
> int res=wert.compareTo(element);
passt da überhaupt nicht, element gibt es nicht, wert ist noch null,

wenn diese Zeile nach Zeile 13 verschoben wird, ist das ganze bei mir kompilierbar und die Ausgabe ist
<b>
<cb>
<cba>

sehe auch keine Möglichkeit zur Verdopplung in diesem Code

------

die Testklasse TestBaum <T> braucht keinen generischen Parameter

> BinaerBaum eins=new BinaerBaum(b);
sollte dagegen generisch sein
BinaerBaum<String> eins=new BinaerBaum<String>(b);
damit du später nur String adden kannst

statt
> class BinaerBaum <T extends Comparable> {
nimmt man besser
class BinaerBaum <T extends Comparable<T>> {
 

Veghana

Mitglied
Mmh, das mit der res Variablen stimmt natürlich, damit ist dann auch die Verdopplung weg (obwohl ich nicht weiß wo die herkam).

Trotzdem sortiert er noch nicht richtig oder gibt nicht richtig aus. Er sollte alle die Größer sind, wo also res.compareTo(element)>0 ist nach rechts einordnen und alle die kleiner oder gleich sind nach links und dann Inorder <links, wert, rechts> ausgeben. Demnach müsste die Ausgabe also <abc> sein und nicht <cba>...

Edit: Ok, hat sich erledigt. Einfach die Bedingung für Res umgedreht, schon war alles klar.

Danke für eure Hilfe, jetzt steht mein Programm.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L Falsche Methode wird geladen Java Basics - Anfänger-Themen 2
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R StringBounds falsche Ergebnisse Java Basics - Anfänger-Themen 5
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
T Falsche Ausgabe ???? Java Basics - Anfänger-Themen 13
S Falsche Ausgabe Java Basics - Anfänger-Themen 6
M Input/Output ISBN Leser - falsche Eingabe ausgeben Java Basics - Anfänger-Themen 2
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
R Methoden Switch wählt das Falsche Java Basics - Anfänger-Themen 17
K Falsche Methode Java Basics - Anfänger-Themen 3
J Falsche Darstellung von Float Java Basics - Anfänger-Themen 2
M Falsche Eingabe wiederholen lassen Java Basics - Anfänger-Themen 2
W Methoden Falsche Felder von Methode belgegt Java Basics - Anfänger-Themen 14
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Falsche Werte bei Zeitmessungen Java Basics - Anfänger-Themen 7
Helgon Falsche Zeichen im Text Java Basics - Anfänger-Themen 10
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
G Bubblesort - Falsche Sortierung Java Basics - Anfänger-Themen 6
D Kriege falsche MD5 Java Basics - Anfänger-Themen 12
R run ->eclipse ruft falsche Programme auf Java Basics - Anfänger-Themen 5
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Falsche Version? Java Basics - Anfänger-Themen 2
C Falsche Zeit Java Basics - Anfänger-Themen 2
C Klammern einlesen!!! Falsche Ausgabe!!!! Java Basics - Anfänger-Themen 4
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
K Verschiebeoperatoren - manchmal falsche Ergebnisse Java Basics - Anfänger-Themen 7
L Datenbankanbindung ODBC falsche pfadangabe? Java Basics - Anfänger-Themen 3
O Falsche Bed. (ein überlauf) seh den Fehler aber nicht. Java Basics - Anfänger-Themen 3
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
S Falsche Ausgabe Java Basics - Anfänger-Themen 3
L Wegen TableSorter wird falsche Zeile einer Tabelle gelöscht? Java Basics - Anfänger-Themen 2
G falsche Version Java Basics - Anfänger-Themen 3
L Falsche Umsetzung von MVC, brauche Hilfe Java Basics - Anfänger-Themen 6
D Tabelle -> Daten eingeben -> Falsche erhalten Java Basics - Anfänger-Themen 9
S Falsche Ausgabe? Java Basics - Anfänger-Themen 2
F Falsche Daten aus Datei Java Basics - Anfänger-Themen 2
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
M Falsche do-Schleife? Java Basics - Anfänger-Themen 4
E falsche Ausgabe Java Basics - Anfänger-Themen 7
D Falsche Datumsausgabe? Java Basics - Anfänger-Themen 5
J erhalte falsche Kalenderwoche - wo ist der Fehler? Java Basics - Anfänger-Themen 2
S Problem mit augabe von Objekten Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben