# TreeMap durch Comparator mit Generics sortieren



## TSH (4. Jan 2008)

Folgender Sachverhalt. Ich habe:

- eine Klasse Node, die eine Informationseinheit darstellt u.a. mit einer Eigenschaft "activation". 

- eine TreeMap genannt stringNodeMapping, die Strings auf Nodes abbildet:

Durch die TreeMap kann ich mir so zu einem String die passende Node raussuchen. Jetzt möchte ich aber, dass die Elemente in der TreeMap immer nach "activation" sortiert sind. Leider klappt das nicht. Bei jeder möglichen Variante zeigt mir Eclipse unterschiedliche Warnings (z.B. can not cast x to y,...). Das hier ist z.B. ein Versuch:


```
public class Node implements Comparable<Node>{

	private float activation;
	
...
	public int compareTo(Node otherNode) {
		// -1: first node get's higher priority, 0: equal, 1: second node get's higher priority
		int result = 0;
		
		if (activation > otherNode.getActivation()) {
			result = -1;
		} else if (otherNode.getActivation() < activation) {
			result = 1;
		}
		return result;
	}
	
}
```


```
public class NodeComparator implements Comparator<Node>{

	public int compare(Node node1, Node node2) {
		// -1: first node get's higher priority, 0: equal, 1: second node get's higher priority
		int result = 0;
		
		if (node1.getActivation() > node2.getActivation()) {
			result = -1;
		} else if (node1.getActivation() < node2.getActivation()) {
			result = 1;
		}
		
		return result;
	}

}
```


```
public class MyApplication{

...

  private TreeMap<String,Node> stringNodeMapping;
  
  NodeComparator nodeComparator = new NodeComparator();
  stringNodeMapping = new TreeMap<String,Node>(nodeComparator);

}
```

Ich bin mir sicher, ich hab irgendwas mit den Generics falsch gemacht. Kann mir jemand sagen, wo der Fehler liegt?


----------



## Beni (4. Jan 2008)

Es wird immer nach dem Schlüssel sortiert, und der Schlüssel ist hier "String", nicht "Node". Da sich der Wert ändern kann, und nach dem Schlüssel gesucht wird, macht es auch Sinn nur den (festen) Schlüssel für die Sortierung zu benutzen.


----------



## Illuvatar (4. Jan 2008)

Auf den ersten Blick kann ich keinen Fehler entdecken - schreib doch mal, wo genau welche Fehler angezeigt werden.

Edit: Ups, klar, Beni hat Recht *pfeif*


----------



## TSH (4. Jan 2008)

Klar ändert sich der Wert der Node->activation. Ich hab gehofft, durch die TreeMap immer eine nach Activation geordnete "Liste" zu haben, bei der ich über einen String an die passende Node ran komme.

Geht also nicht?

Noch mal die Anforderungen:
- Ich will eine Node ansprechen können (hier geht das über einen String als Schlüssel)
- Ich will die Nodes nach Aktivierung sortiert halten.

Was empfehlt Ihr?


----------



## Beni (4. Jan 2008)

Wie soll die TreeMap denn überhaupt bemerken, dass sich "activation" geändert hat? Keine der standardmässigen Listen, Maps oder Sets wird das einfach so bemerken.

IMHO musst du da selbst was erfinden, z.B. zwei Maps machen und die Nodes hin und herschieben wenn sich "activation" ändert.


----------



## TSH (4. Jan 2008)

Ich werde nur in einer einzigen Methode die Activations ändern. Hatte gehofft, ich könnte dann einfach durch so was wie stringNodeMapping.sort() neu sortieren. Geht also nicht?


----------



## TSH (4. Jan 2008)

Dann mach ich jetzt 2 Datenstrukturen. Eine ArrayList<Node> und das angesprochene Mapping. Dann würde es gehen, oder? 

Wenn ich über's Mapping auf eine Node ändere könnte ich danach die ArrayList neu sortieren und bin fertig, oder?


----------



## Beni (4. Jan 2008)

Sieht vernünftig aus.

Notiz zur Performance: Je nachdem wie oft du die Sortierung benötigst, kannst das Neusortieren auch verzögern (oder das veränderte Element jeweils entfernen und per Insertion-Sort wieder einfügen).


----------



## TSH (4. Jan 2008)

Zur Performance:
Es sind ca. 3000 Nodes, die verwaltet werden wollen. Ist eine ArrayList da überhaupt zu empfehlen?

Werden bestimmte Aktionen ausgelöst (und das geschieht regelmäßig), ändert sich die Activation von ca. 100 Nodes und die Liste muss neu sortiert werden.


----------



## Beni (4. Jan 2008)

3000? Das ist nicht viel, sollte keine Probleme geben :wink:


----------

