Problem beim Sortieren einer HashMap mit TreeSet

hildchen

Neues Mitglied
Hi,

ich hab ein Problem mit dem Sortieren einer Hashmap über ein TreeSet.

Meine HashMap besteht aus einem Objekt Superplayer, und einer zufällig erzeugten IntegerZahl.


Java:
Map<SuperPlayer, Integer> hMap = new HashMap<SuperPlayer, Integer>();

for (int i = 0; i < 5; i ++) {

 int val = Zufall.getZufall(100) // liefert eine zufällige Zahl von 0 - 100 zurück

 hMap.put( (SuperPlayer) data.getVecPlayer().elementAt( i ), new Integer( val ) );

}

Nach füllen der Hashmap soll diese Hashmap nun ordnungsgemäß sortiert werden, und zwar absteigend anhand des HashMap-Values.

Java:
HashMap map = new LinkedHashMap();

List yourMapKeys = new ArrayList( hMap.keySet() );
List yourMapValues = new ArrayList( hMap.values() );
TreeSet sortedSet = new TreeSet( yourMapValues );

Object[] sortedArray = sortedSet.toArray();
int size = sortedArray.length;
System.out.println("SIZE:" + size);

// Sortieren der HashMap in das TreeSet (DESCENDING !!!!)
for ( int i = size; i > 0; )
{
    	map.put( yourMapKeys.get( yourMapValues.indexOf( sortedArray[--i] ) ), sortedArray[i] );            
}

Das ganze funktioniert eigentlich. Allerdings gibt es ein Problem, so bald in der ersten Hashmaps zwei SuperPlayer zufällig die selbe Integer Zahl zugeordnet bekamen. int size = sortedArray.length ist dann nämlich 4 und nicht 5. Bei 5 gleichen Zahlen wäre die Size 1.

Als Grundlage für diesen Code diente: Sort an HashMap - Real's Java How-to dieses Beispiel hier.

Es soll natürlich so sein, dass alle Fünf Superplayer anhand der Integer Zahlen sortiert werden, er lässt aber diejenigen Superplayer zahlen, welche eine identische Integer-Zahl haben, außen vor und nimmt nur einen von ihnen.

Kann mir jemand helfen ?
 
Java:
List yourMapKeys = new ArrayList( hMap.keySet() );
List yourMapValues = new ArrayList( );
for (Object key : yourMapKeys ){
 yourMapValues.add(hMap.get(key));
}

edit:
yourMapValues.indexOf() wird aber auch nicht gut auf doppelte reagieren, so gehts also nicht..,

da musst du wohl das entrySet() holen und das mit einem speziellen Comparator sortieren
 
Java:
		List<Map.Entry<SuperPlayer, Integer>> list = new LinkedList<Map.Entry<SuperPlayer, Integer>>(hMap.entrySet());
		Collections.sort(list,new Comparator<Map.Entry<SuperPlayer, Integer>>() {
			@Override
			public int compare(Entry<SuperPlayer, Integer> o1, Entry<SuperPlayer, Integer> o2) {
				return o2.getValue().compareTo(o1.getValue());
			}
		});

und dann evtl. eine LinkedHashMap füllen?!
 
Das ist eklig, oder ?

Ich werde mich später noch einmal intensiver damit befassen, weil das mit den duplicte entries wohl ein grundlegendes Problem dieser Programmierweise darstellt. Für den Anfang verhindere ich einfach, dass Random-Zahlen doppelt auftreten können. Unterm Strich ist das auch egal, weil hier lediglich die Reihenfolge der SuperPlayer festgelegt wird.

Ich löse das Problem damit zwar nicht, aber ich umgehe es. Typisches Beispiel wieder zwischen Unterschied FH/BA Stundent und Uni-Absolvent 😉
 
Hi, vielleicht habe ich da auch was falsch verstanden aber warum nimmst du eine Hash-Map, wenn dich gleiche Einträge nicht stören?

Würde es auch wie eRaa machen und einfach ne Liste nehmen und diese sortieren. Und wenn du Value und Key vertauschst brauchst du den Comparator noch nichtmal zu überschreiben glaube ich.
 

Zurück
Oben