Typcasting wie??

J

JavaMan123

Gast
Hallo Leute,

es handelt sich um die folgenden 2 Klassen ...

Java:
package edu.hm.cs.swe2.bintreeobject;

import edu.hm.cs.swe2.bintree.base.GeometricFigure;

public class BinTreeNodeObject {

	// versteckte Klassenattribute
	private Object value;

	private BinTreeNodeObject left;

	private BinTreeNodeObject right;

	// Custom-Konstruktors
	public BinTreeNodeObject(Object value) {
		this.value = value;
		this.left = null;
		this.right = null;
	}

	public BinTreeNodeObject(Object value, BinTreeNodeObject left,
			BinTreeNodeObject right) {
		this.value = value;
		this.left = left;
		this.right = right;
	}

	/*
	 * Private Prefix- Infix- und PostfixMethoden, um die Binärbaume in
	 * verschiedenen Reihenfolgen auszugeben, da diese für andere Klassen nicht
	 * sichtbar sind werden sie mittels einer anderen Methode aufgerufen (in
	 * unserem Fall in der Methode "printTreeViewVariants()"
	 */
	private void printPrefixOrder() {
		System.out.print(value + " ");
		if (left != null)
			left.printPrefixOrder();
		if (right != null)
			right.printPrefixOrder();
	}

	private void printInfixOrder() {
		if (left != null)
			left.printInfixOrder();
		System.out.print(value + " ");
		if (right != null)
			right.printInfixOrder();
	}

	private void printPostfixOrder() {
		if (left != null)
			left.printPostfixOrder();
		if (right != null)
			right.printPostfixOrder();
		System.out.print(value + " ");
	}

	// private Methode, die von außen nicht sichtbar ist,
	// allerdings wird diese Methode, welche für das graphische
	// Gerüst zuständig ist mittels der öffentlichen Methode
	// "printTreeViewVariants()" ausgegeben
	private void printTreeView(String prefix) {
		System.out.println(prefix + "-" + value);

		if (left != null)
			left.printTreeView(prefix.concat(" |"));
		else
			System.out.println(prefix + " |-");

		if (right != null)
			right.printTreeView(prefix.concat("  "));
		else
			System.out.println(prefix + "  -");
	}

	// Methode zum ausgeben der Binärbaumordnungen
	// und des graphischen Gerüsts
	public void printTreeViewVariants() {
		StringBuilder s;

		if (isSorted())
			s = new StringBuilder("sortierter");
		else
			s = new StringBuilder("unsortierter");
		s.append(" Baum:");
		/*
		 * s.append(" "); s.append(value.getClass().getCanonicalName());
		 * s.append("-Baum:");
		 */

		System.out.println();
		System.out.println("Prefix-Ordnung, " + s);
		printPrefixOrder();
		System.out.println();
		System.out.println();

		System.out.println("Postfix-Ordnung, " + s);
		printPostfixOrder();
		System.out.println();
		System.out.println();

		System.out.println("Infix-Ordnung, " + s);
		printInfixOrder();
		System.out.println();
		System.out.println();

		System.out.println("Baumdarstellung, " + s + ": ");
		printTreeView("");
		System.out.println();
		System.out
				.println("---------------------------------------------------------------------");
		System.out.println();
	}

	// Hier wird getestet, ob ein bestimmter Wert
	// bereits im Binärbaum enthalten ist
	public void insertSorted(Object newValue) {
		
		if (newValue.compareTo(value) < 0) {
			if (left == null)
				left = new BinTreeNodeObject(newValue);
			else
				left.insertSorted(newValue);
		} else if (newValue.compareToIgnoreCase(value) == 0) {
			System.out
					.println("Der Wert "
							+ newValue
							+ " ist schon im Baum enthalten, wird nicht nochmal eingefügt!");
		} else {
			// newValue > value
			if (right == null)
				right = new BinTreeNodeObject(newValue);
			else
				right.insertSorted(newValue);
		}
	  
	}

	// Methode, welche überprüft, ob der Binärbaum sortiert ist
	public boolean isSorted() {
		
	

		if (left == null) {
			if (right == null)
				return true;
			else if (right.getValue().compareToIgnoreCase(value) < 0)
				return false;
			else
				return right.isSorted();
		} else if (right == null) {
			// left != null
			if (left.getValue().compareToIgnoreCase(value) > 0)
				return false;
			else
				return left.isSorted();
		} else {
			// left != null && right != null
			if (left.getValue().compareToIgnoreCase(value) > 0
					|| right.getValue().compareToIgnoreCase(value) < 0)
				return false;
			else
				return left.isSorted() && right.isSorted();
		}
	  
	}
		

	// Getter-Setter-Methoden
	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}

	public BinTreeNodeObject getLeft() {
		return left;
	}

	public void setLeft(BinTreeNodeObject left) {
		this.left = left;
	}

	public BinTreeNodeObject getRight() {
		return right;
	}

	public void setRight(BinTreeNodeObject right) {
		this.right = right;
	}

}



Java:
package edu.hm.cs.swe2.bintreeobject.nodes;

public abstract class GeometricFigure implements Comparable {

	public abstract double calculateArea();

	public abstract double calculateCircumference();

	public abstract int getNumberOfVertices();

	public int compareTo(Object newValue) {
		if (this.equals(newValue)) {
			return 0;
		} else {
			if (newValue instanceof GeometricFigure) {
				GeometricFigure typeCast = (GeometricFigure) newValue;
				if (Math.abs(this.calculateArea() - typeCast.calculateArea()) < Double.MIN_NORMAL) {
					if (this.getNumberOfVertices() == typeCast
							.getNumberOfVertices()) {
						if (this.calculateCircumference() <= typeCast
								.calculateCircumference()) {
							return -1;
						} else
							return 1;

					}
				} else {
					if (this.calculateArea() < typeCast.calculateArea()) {
						return -1;
					} else {
						return 1;
					}
				}
				if (this.getNumberOfVertices() < typeCast
						.calculateCircumference()) {
					return -1;
				} else {
					return 1;
				}
			}
			else 
			{
				System.out.println("Fehler");
						return -99;
			}
		}
	}

}


also da ja die Klasse Object nicht das Interface Comparable implementiert, ist die Methode isSorted() und insertSorted() fehlerhaft
( diese methoden sind für das Sortieren von Binärbäumen zuständig)

Mein Problem, ich weiß nicht wie ich den Typcast in die Methoden anbringen soll, denn um die Datenwerte mittels compareTo() vergleichen zu können, müssen diese zunächst mittlels Typecast in Objekte vom Typ Comparable umgewandelt werden

Das Problem ist ja auch, dass wir Datenobjekte vom Typ String mittels compareToIgnoreCase() vergleichen andere Datenobjekte jedoch mittels compareTo()

Der normale Typecast ist mir bekannt z.B. von double in int ....aber diese Problem bekomm ich einfach nicht gelöst

Kann mir bitte einer helfen?

mfg
 
S

SlaterB

Gast
gib doch einfach die Value als Comparable vor

private Comparable value;
statt
private Object value;

alle getter/ setter/ Konstruktoren usw. anpassen

-------

ansonsten ist ein Cast einfach:
Comparable c = (Comparable) object;
c.compareTo()
 
J

JavaMan123

Gast
Danke für deine schnelle antwort!

ok ich werde es mal probieren, sieht wirklcih einfacher aus als ich zuerst dachte... :p
 
J

JavaMan123

Gast
Doch nochmal eine Frage ... -.-

Hab das jetzt so gemacht

Java:
if (newValue instanceof GeometricFigure) {
			Comparable cast2 = (Comparable) newValue ;
		
		
		if (newValue.compareTo(value) < 0) {
			if (left == null)
				left = new BinTreeNodeObject(newValue);

allerdings kommt es zu einer Fehlermeldung wenn ich nun versuche

if(newValue.cast2.compareTo(value)<)...

wenn ich das cast2.compareTo in klammern setze bringt mir das auch nichts

mfg
 
G

gman

Gast
Hi,

deine GeometricFigure-Klasse implementiert doch das Comparable-Interface. Da
brauchst du den Cast doch gar nicht, bzw. könntest direkt auf GeometricFigure
casten:

Java:
        if (newValue instanceof GeometricFigure) {
            GeometricFigure gf = (GeometricFigure) newValue ;
        
        
        if (gf.compareTo(value) < 0) {
            if (left == null)
                left = new BinTreeNodeObject(gf);
 
S

SlaterB

Gast
gerade weil sie das Interface implementiert, macht es mehr Sinn, auf Comparable zu casten,
dann funktioniert nämlich der Code mit allen Comparable

dafür gibts überhaupt Interface, wenn man GeometricFigure castet, dann reicht die Implementierung von compareTo(), ganz egal ob das Interface implementiert ist

der instanceof-Test sollte dann natürlich auch auf Comparable gehen

----


> Comparable cast2 = (Comparable) newValue ;
> if (newValue.compareTo(value) < 0)

->


> Comparable cast2 = (Comparable) newValue ;
> if (cast2.compareTo(value) < 0)

...
 

Ähnliche Java Themen

Neue Themen


Oben