# TreeSet und Comparator will nicht so wie ich



## Jay1980 (11. Jun 2009)

Servus,

Comparator und TreeSets sind für mich Neuland, daher hänge ich gerade etwas bei der Fehlersuche.

Ich bekomme eine classCastException, genauer

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: jobaapp.JobaSmallestCircleCandidate cannot be cast to java.lang.Comparable
	at java.util.TreeMap.put(TreeMap.java:559)
	at java.util.TreeSet.add(TreeSet.java:255)
	at jobaapp.JobaSmallestCircle.computeSmallestCircle(JobaSmallestCircle.java:110)

Okay, ich habe drei Klassen und ging so vor: einmal habe ich die Klasse JobaSmallestCircle, da steckt die Collection drin, die viele Objekte vom Typ JobaSmallestCircleCandidate fasst. Für die Liste habe ich einen Comparator geschrieben und initialisiert, JobaSmallestCircleCandidateComparator. Jetzt gibt es eine Methode in der Klasse JobaSmallestCircle, die dann ein neues Element in die Liste aufnehmen soll und da wirft es mir diese Exception. Hier noch die Klassenausschnitte, ich dachte mein Vorgehen mit dem Comparator sollte so richtig sein, oder muessen die Klassen, die dann mit dem Comparator arbeiten auch irgend ein 'implements' stehen haben?

Klasse JobaSmallestCircle

```
public class JobaSmallestCircle 
{
	ArrayList<Point> points;
	TreeSet<JobaSmallestCircleCandidate> smallestCircleCandidates;
	Point centerOfCircle;
	int radius;
...........
        JobaSmallestCircle()
	{
		// Dummykonstruktor
		points = new ArrayList<Point>();
		smallestCircleCandidates = new TreeSet<JobaSmallestCircleCandidate>();
................
                                        
                                        if ( wasOuterPointInLoop == false )
					{
						ds += "------> ja wir haben ein Kandidatenpaar, siehe letzten for-D-Lauf;\n";
						// hier hagelt es die Exception!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
						smallestCircleCandidates.add(jscc);
					}
```

Comparator-Klasse

```
public class JobaSmallestCircleCandidateComparator implements Comparator<JobaSmallestCircleCandidate> 
{
	@Override
	public int compare( JobaSmallestCircleCandidate o1, JobaSmallestCircleCandidate o2 )
	{
		return o1.radius - o2.radius;
	}
	
}
```

JobaSmallestCircleCandidate-Klasse

```
public class JobaSmallestCircleCandidate
{
	// Startpunkt 
	Point startPoint;
	Point endPoint;
	
	// Mittelwert des Kreises
	Point centerOfCircle;
	
	// Radius
	int radius;
	double expRadius;
	
	JobaSmallestCircleCandidate( Point a, Point b )
	{
		startPoint = a;
		endPoint = b;
		computeCircleNumbers();
	}
```


----------



## Beni (11. Jun 2009)

```
smallestCircleCandidates = new TreeSet<JobaSmallestCircleCandidate>();
```
Da fehlt der Comparator. Der Comparator musst du dem Konstruktor von TreeSet uebergeben.

-->

```
new TreeSet<...>( new DingsdaComparator() )
```


----------



## Jay1980 (11. Jun 2009)

Danke,

lustigerweise wusste ich das schon, habe den Comparator auch übergeben, aber als ich den Code von dir gesehen habe fiel mir auf, dass ich ja zwei Konstruktoren schrieb und eben nicht daran dachte, dass ich den anderen ja aufrufe.


----------

