PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JAVA Objects vergleichen für BTree


TS
2010-06-08, 19:48:32
abend,

ich möchte in java meine eigene binarytree klasse schreiben, rein zur übung.
In einen btree sollen objekte vom typ treenode gespeichert werden können. tnode hat dabei 3 exemplarvarialben: tnode lef, tnode right und Object value.

folglich sollen meine daten, die ich eigentlich in den baum speichern möchte im tnode vorliegen, und da tnode eine Object variable verwaltet, können natürlich alle daten gespeichert werden.

nun ist es ja so, dass binarytrees zunächst die erste variable in der wurzel speichert, alle anderen variablen werden entweder links, wenn sie vom wert her kleiner sind, als das wurzelelement, oder rechts, wenn sie größer sind als das wurzelelement gespeichert.

deshalb muss in der btree klasse eine methode vorhanden sein, welche die values der treenodes miteinander vergleicht, und zwar je nach dem, welches art von daten gespeicher sind. also bei integer variablen müssen einfach die int werte verglichen werden, und bei einem anderen object müssen nach bestimmten kriterien die eigenen werte der objekte verglichen werden, welche das auch immer sind.

wie kann ich es also schaffen, dass zwei objekte, egal von welchem typ sie sind, entweder int, object, string oder sonst irgend was, nach bestimmten kriterien miteinander verglichen werden?

ich hoffe ich habe mich verständlich ausgedrückt... :)

Monger
2010-06-08, 19:56:59
Zwei Wörter: IComparable Interface.

Allerdings kannst du schlecht Äpfel mit Birnen vergleichen. Du musst erzwingen, dass alle Objekte im Tree zumindest mal von der selben Sorte sind, und mindestens das IComparable Interface implementieren. Das spricht schonmal schwer für Generics mit Boundaries.

Ich weiß schon gar nicht mehr wie die Java Syntax dafür genau aussieht, aber so ungefähr müsste das sein:


Public Class <T:IComparable> MyBinaryTree{ }

Ganon
2010-06-08, 19:59:56
Hier findest du Infos darüber:
http://openbook.galileocomputing.de/javainsel8/javainsel_12_004.htm#mj02f08ed5d8822fef2383619f653b0ce6

TS
2010-06-08, 20:24:35
danke, hab jetz statt den wert im treenode vom typ object zu nehmen einfach "Comparable value" genommen. damit muss zwar jede klasse dann comparable implementieren, aber anders gehts wohl net...

Der_Donnervogel
2010-06-08, 21:34:40
danke, hab jetz statt den wert im treenode vom typ object zu nehmen einfach "Comparable value" genommen. damit muss zwar jede klasse dann comparable implementieren, aber anders gehts wohl net...Doch es gibt noch mindestens zwei andere Wege. Falls es nicht gewünscht ist, alle Klassen Comparable zu machen, würde ich mir auch mal die Alternative mittels java.util.Comparator ansehen. Da muss nicht die Klasse selbst ein Interface unterstützen, stattdessen schreibt man eine Comparatorklasse die in der Lage ist zwei Objekte zu vergleichen.

Falls man ganz spezielle Anforderungen hat, kann man auch mit Reflection arbeiten. Damit kann man dann auch völlig unterschiedliche Objekte bearbeiten. Das würde ich aber nur als allerletzten Ausweg nehmen, da Reflection nicht unbedingt den übersichtlichsten Code ergibt. Ich habe es aber einmal gemacht. Da brauchte es eine spezielle Filterung/Sortieren, wo der Benutzer zur Laufzeit bestimmt hat welche Eigenschaften welcher Objekte als Basis des Vergleichs/der Filterung(en) dienen sollen.

Edit:
Hier mal ganz kurz ein einfaches Beispiel mit Comperator:

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;

public class Test {

private List<Object> m_List = new LinkedList<Object>();

public static void main(String[] args) {
Test test = new Test();
test.test();
}

private void test() {
m_List.add("123.0");
m_List.add(20);
m_List.add(new Double(25));
m_List.add("2");
for (Object obj : m_List) {
System.out.println(obj);
}
Collections.sort(m_List, new NumberComperator());
for (Object obj : m_List) {
System.out.println(obj);
}
}

private class NumberComperator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
Double val1 = Double.parseDouble(o1.toString());
Double val2 = Double.parseDouble(o2.toString());
return val1.compareTo(val2);
}
}
}