Auf Thema antworten

Deswegen mein "Alles andere sind Fehler": Das mit der Map ist klar und deutlich dokumentiert. Das mit dem catch-Block verstehe ich gerade nicht; müsstest du evtl. noch einmal genauer ausführen. Und in deinem Codebeispiel findet sich der Fehler bereits in der Initialisierung von result und found: Wenn [c]result = null[/c] bedeutet, dass noch nichts gefunden wurde (einfach weil noch nichts durchsucht wurde), kann man doch nicht direkt darunter das Gegenteil behaupten. ;) Außerdem ist [c]found[/c] redundant (soweit aus der Skizze ersichtlich), weil die Schleife wahrscheinlich mit [c]result != null[/c] (äquivalent zu [c]found[/c]) abbricht. Und dann kann man das auch im Code deutlich machen, indem man die Schleife mit [c]break[/c] beendet, sobald result den richtigen Wert bekommen hat.



Welche Methode meinst du genau? Ich nehme indes stark an, dass auch das so dokumentiert sein sollte.



Ich finde es auch nervig, praktisch jedes Mal im Konstruktor auf null überprüfen zu müssen, wenn ich nicht sofort etwas mit dem Übergebenen mache. An solchen Stellen wünsche ich mir dann manchmal solche Überprüfungen auf null durch den Compiler (wie in den weiter oben angeführten Beispielen).



So vielleicht:

[code=Java]

public static <T> List<T> toList(Node<T> root) {

  List<T> list = new ArrayList<T>();

  toList(root, list);

  return list;

}


private static <T> void toList(Node<T> node, List<T> list) {

   if(node.left() != null) toList(node.left(), list);

   list.add(node.value());

   if(node.right() != null) toList(node.right(), list);

}

[/code]

Ich weiß gerade nicht, was bei deinem Code passiert, wenn [c]root == null[/c] gilt. Bei meinem gibt es jedenfalls eine NPE. Der Rückgabewert meiner Implementierung wird jedenfalls nicht null sein, und sehr wahrscheinlich ist es ein Fehler, die Methode überhaupt mit null aufzurufen. (Gegenfrage: Wie sollte es anders sein?)


Zu deiner Implementierung: Sie erzeugt für nahezu jeden Knoten Iteratoren (Wirth ;) ) und lässt jeden einzelnen Knoten als Menge erscheinen. Für meine Begriffe ist diese Darstellung vor allem komplizierter. Als ich jedenfalls deinen Code spontan das erste Mal las, dachte ich nur: "Meine Güte, für einen Binärbaum hat ein Knoten hier aber verdammt viele Kinder." Denn was nicht aus deinem Code hervorgeht: [c]node.left()[/c] bzw. [c]node.right()[/c] sind jeweils höchstens einelementige Mengen (oder leer).


Wenn aber z.B. ich in meinem Code von Mengen rede, dann meine ich vor allem Mengen mit beliebig vielen Elementen. Wenn ich dagegen ausdrücken möchte, dass (für deine Begriffe) eine Menge leer ist oder höchstens ein Element besitzt, dann nehme ich mir einfach eine Referenz auf ein Objekt, denn diese ist entweder null (entspricht dem Fall, dass die Menge leer ist) oder von null verschieden (dann ist sie einelementig). Das ist doch wie gemacht dafür! Und dann kann ich auch nicht z.B. aus der höchstens einelementigen Menge aus Versehen eine zweielementige machen.


Ark



Oben