2010-01-24 5 views
2

Je souhaite que le code suivant fonctionne dans l'environnement Java ME/J2ME. S'il vous plaît aider:Tri d'une table de hachage basée sur sa valeur d'entrée (pas la clé)

Hashtable <Activity, Float>scores = new Hashtable<Activity, Float>(); 
    scores.put(act1, 0.3); 
    scores.put(act2, 0.5); 
    scores.put(act3, 0.4); 
    scores.put(act5, 0.3); 


    Vector v = new Vector(scores.entrySet()); 
    Collections.sort(v); //error is related to this line 
    Iterator it = v.iterator(); 

    int cnt = 0; 
    Activity key; 
    Float value; 

    while(it.hasNext()){ 

     cnt++; 
     Map.Entry e=(Map.Entry)it.next(); 

     key = (Activity)e.getKey(); 
     value = (Float)e.getValue(); 

     System.out.println(key+", "+value); 
    } 

Il ne fonctionne pas, je reçois l'erreur:

Exception in thread "main" java.lang.ClassCastException: java.util.Hashtable$Entry cannot be cast to java.lang.Comparable This points to the line that I've indicated with a comment in the code.

s'il vous plaît aider et garder à l'esprit que j'utilise J2ME!

Répondre

0

La méthode entrySet ne renvoie pas les valeurs dans la table de hachage, elle renvoie les paires clé-valeur. Si vous voulez les valeurs, vous devez utiliser la méthode values à la place. Si vous voulez les paires valeur-clé mais les trier uniquement sur la valeur, vous devez implémenter un Comparator pour les paires valeur-clé qui compare les valeurs de deux paires, et utiliser la surcharge de la méthode sort qui prend le Comparator avec la liste.

4

Le code que vous avez n'est pas proche de J2ME valide, c'est java complet (J2SE); J2ME n'a actuellement pas de génériques, ni de classe Collections, ni d'interface comparable - vérifiez JavaDoc pour MIDP 2 et CLDC 1.1, les composants de J2ME. Votre erreur les mentionne, donc certainement pas venu de J2ME, ce qui suggère que vous pourriez faire quelque chose de fondamentalement faux dans la configuration de votre projet?

Si vous voulez faire cela dans J2ME, vous devez écrire vous-même une fonction de tri, car pour autant que je sache, rien de tel n'existe. Bubblesort sera plus facile à écrire, car la seule façon d'accéder facilement aux membres séquentiels de la hashtable est d'utiliser Enumerations (via scores.keys() et scores.values ​​()). En supposant que vous voulez trier vos activités dans l'ordre croissant en fonction des scores (flotteurs) auxquels ils sont associés, vous voulez quelque chose comme:

boolean fixedPoint = false; 
while (!fixedPoint) 
{ 
    fixedPoint = true; 

    Enumeration e = scores.keys();  
    if (!e.hasMoreElements()) return; 
    Object previousKey = e.nextElement(); 

    while (e.hasMoreElements()) { 
    Object currentKey = e.nextElement(); 
    if ((Float) scores.get(currentKey) > (Float) scores.get(previousKey)) { 
     swap(currentKey, previousKey); 
     fixedPoint = false; 
    } 
    previousKey = currentKey; 
    } 
} 

En outre, quelque part, vous aurez besoin d'écrire une fonction d'échange que swaps deux éléments de la hashtable lorsque donné leurs clés. A noter que ce n'est pas la mise en œuvre la plus rapide possible - le tri à bulles ne sera pas bon si vous prévoyez avoir de grandes listes. D'un autre côté, c'est très facile avec les outils limités que J2ME vous donne!