# root.getChildren() - Liste sortieren - ClassCastException



## cmkatz (28. Dez 2005)

Guten Morgen zusammen,

ich habe bereits die Suche benutzt, aber nichts passendes zu meinem Problem gefunden.  :cry: 

Zunächst ein paar Daten zur Umgebung: Eclipse 3.1, J2SDK 1.4.2

So, nun mein Problem:
Ich lese eine XML-Datei mit JDOM ein.

Aufbau der XML-Datei:

```
<?xml version="1.0" encoding="UTF-8"?>
<record name="angebot" id="32">
    <field name="feld1" type="Long">1</field>
    <field name="feld2" type="Long">1</field>
    <field name="feld3" type="String">Text</field>
    <field name="feld4" type="Long">1</field>
    <field name="feld5" type="String">noch ein Text</field>
    <field name="feld6" type="Date">28.12.2005</field>
    <field name="feld7" type="Long">1</field>
</record>
```

Das mache ich folgendermaßen:

```
...
Document doc1 = getDocument(datei1);
Element root = getRoot(doc1);
List allChildren = root.getChildren();
...
```

Wenn ich jetzt versuche mit

```
Collections.sort(allChildren);
```
die List zu sortieren, erhalte ich folgende Fehlermeldung:


```
java.lang.ClassCastException
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.sort(Unknown Source)
	at java.util.Collections.sort(Unknown Source)
```

Ich hoffe, ihr könnt mit den Angaben etwas anfangen und mir weiter helfen. 

Meinen Dank schon mal im Voraus!

Gruß
cmkatz


----------



## cmkatz (28. Dez 2005)

Nochmal ich,

oben beschriebenes Problem habe ich mittlerweile durch Erstellen einer Klasse, die Comparator implementiert, gelöst, soll heißen, der Fehler kommt nicht mehr. Die Klasse sieht so aus:


```
public class AngComparator implements Comparator {
	
	public int compare(Object arg0, Object arg1) {
                        return 0;
	}
	
}
```

Aber sortiert wird nicht richtig. Es soll nach den Values des Attributs "Name" des Elements "field" sortiert werden.

Dann habe ich die Methode compare(Object arg0, Object arg1) folgendermaßen umgeschrieben:

```
public int compare(Object arg0, Object arg1) {
		int result = 0;

		Element elm0 = (Element) arg0;
		Element elm1 = (Element) arg1;

		String feld0 = elm0.getAttribute("name").getValue();
		String feld1 = elm1.getAttribute("name").getValue();

		Collator col = Collator.getInstance(new Locale("de", "DE", ""));
		
		if ( col.compare( feld0, feld1 ) < 0 ){
		     result = -1;
		}

		if ( col.compare( feld0, feld1 ) == 0 ){
		     result = 0;
		}
		
		if ( col.compare( feld0, feld1 ) > 0 ){
		     result = 1;
		}

		return result;
	}
```

Und nun erhalte ich folgende Fehlermeldung:

```
org.jdom.IllegalAddException: The element already has an existing parent "record"
	at org.jdom.ContentList.add(ContentList.java:177)
	at org.jdom.ContentList.add(ContentList.java:138)
	at org.jdom.ContentList.set(ContentList.java:679)
	at org.jdom.ContentList$FilterListIterator.set(ContentList.java:1142)
	at java.util.Collections.sort(Unknown Source)
```

Hm...

Und nu?

Ich steh irgendwie völlig auf dem Schlauch!

Gruß
cmkatz


----------



## cmkatz (28. Dez 2005)

So, auch dieses Problem habe ich nun lösen können:

Die Methode compare sieht jetzt folgendermaßen aus:


```
public int compare(Object arg0, Object arg1) {
		int result = 0;
		Element elm0 = (Element) arg0;
		Element elm1 = (Element) arg1;
		String feld0 = elm0.getAttribute("name").getValue();
		String feld1 = elm1.getAttribute("name").getValue();
		
		result = feld0.compareTo(feld1);

		return result;
	}
```

und die Stelle, an der Sortiert werden soll so:

```
Document doc = getDocument(datei); 
    Element root = getRoot(doc); 
    AngComparator angComp = new AngComparator();
    ArrayList temp = new ArrayList(root.getChildren());
    Collection.sort(temp, angComp);
    root.removeChildren();
    root.setContent(temp);
```

Dennoch danke fürs Nachdenken! (Manchmal hilft es, wenn man sein Problem aufschreibt und danach eine Rauchen geht!  :wink: )

Gruß und guten Rutsch ins Neue Jahr!
cmkatz


----------

