2016-11-19 3 views
2

je dois trier une carte par des valeurs en utilisant la méthode triée sur la carte et d'expression lambda comme arguments, alors que la carte a une structure comme:Tri Java Carte par Liste des valeurs

Map<T,List<T>>= 
Groovy = [Z, Y, X, D] 
Java = [V, B, C, D, A, Z] 
C++ = [G, J, H] 
C# = [P, S, Q, V, D] 
Scala = [A, D] 

Ma méthode Sorted:

sorted(Map<T,List<T>> map,Comparator<Map<T,List<T>>> comp) 

puis l'implémenter dans une autre fonction chargée de lire les données du fichier et de les mettre en correspondance. Ceci est ma méthode triée:

public Map<T,List<T>> sorted(Map<T,List<T>> map, Comparator<Map<T,List<T>>> comp){ 
    List list = new LinkedList(map.entrySet()); 
    Collections.sort(list, comp); 
    HashMap sortedHashMap = new LinkedHashMap(); 
    for (Iterator it = list.iterator(); it.hasNext();) { 
     Map.Entry entry = (Map.Entry) it.next(); 
     sortedHashMap.put(entry.getKey(), entry.getValue()); 
    } 
    return sortedHashMap; 
    } 

Et voilà comment je l'ai utilisé dans une autre méthode:

Comparator<Map<T,List<T>>> comp = new Comparator() { 
     public int compare(Object o1, Object o2) { 
      return ((Comparable) ((Map.Entry) (o1)).getValue()) 
       .compareTo(((Map.Entry) (o2)).getValue()); 
     }}; 
iniMap=sorted(iniMap,comp); 

Quand je lance mon programme, j'obtiens l'erreur suivante:

java.lang.ClassCastException: java.util.LinkedList cannot be cast to java.lang.Comparable 

Tous l'aide serait appréciée, je suis coincé.

Répondre

3

Oui, la classe LinkedList (comme la sous-classe et toute List/Collection) ne met pas en œuvre l'interface Comparable, vous obtiendrez l'exception lors de l'exécution.

(1) Vous feriez mieux de penser à votre propre algorithme de comparaison avec T s plutôt que d'utiliser la coulée incorrecte avec Object s:

Comparator<List<T>> comparator = (l1, l2) -> l1.size() - l2.size(); 

(2) Évitez les types premières, essayez de généraliser tout le code:

HashMap sortedHashMap = new LinkedHashMap(); 
     | 
     V 
HashMap<List<T>, T> map = new LinkedHashMap<>(); 

(3) Transformez la classe anonyme en une expression lambda.

(4) Si vous souhaitez trier une carte par des valeurs (List<T>), le comparateur doit également être approprié:

Comparator<Map<T,List<T>>> c 
     | 
     V 
Comparator<List<T>> c