2010-02-01 18 views
5

que tienen una clase de comparación en Java para comparar Mapa entradas:java sin control fundido

public class ScoreComp implements Comparator<Object> { 

    public int compare(Object o1, Object o2) { 

     Entry<Integer, Double> m1 = null; 
     Entry<Integer, Double> m2 = null; 

     try { 
      m1 = (Map.Entry<Integer, Double>)o1; 
      m2 = (Map.Entry<Integer, Double>)o2; 
     } catch (ClassCastException ex){ 
      ex.printStackTrace(); 
     } 

     Double x = m1.getValue(); 
     Double y = m2.getValue(); 
     if (x < y) 
      return -1; 
     else if (x == y) 
      return 0; 
     else 
      return 1;   
    } 

} 

cuando compilo este programa me sale el siguiente:

warning: [unchecked] unchecked cast 
found : java.lang.Object 
required: java.util.Map.Entry<java.lang.Integer,java.lang.Double> 
      m1 = (Map.Entry<Integer, Double>)o1; 

tengo que ordenar las entradas de mapa en el base de los valores dobles.

Si creo el siguiente comparador, aparece un error en la llamada para ordenar la función de matrices (obtengo una entrada del mapa y luego uso el conjunto como una matriz).

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> 

cómo implementar este escenario.

+0

¿Qué quiere decir con el conjunto como una matriz? – pgras

+0

vea el comentario debajo de la respuesta del apilador –

+0

Esto no tiene nada que ver con las excepciones; He cambiado el título y las etiquetas en consecuencia –

Respuesta

2

apilador ha descrito cómo corregir el código que ha mostrado. Aquí se explica cómo corregir el código en su comentario: en primer lugar, no use matrices, porque las matrices no funcionan con genéricos (no puede tener una matriz de un tipo genérico). En su lugar, se puede utilizar un List y la Collections.sort() método:

List<Map.Entry<Integer, Double>> mList = 
     new ArrayList<Map.Entry<Integer, Double>>(Score.entrySet()); 
    Collections.sort(mList, new ScoreComp()); 
+0

cómo desearía poder aceptar dos respuestas como correctas. tu respuesta es buena, pero para mi trabajo usaría el enfoque de skaffman. –

2

¿Cuál está sobre la reescritura como

public class ScoreComp implements Comparator<Map.Entry<Integer, Double>> { 

    public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) { 
     if (o1.getValue() < o2.getValue() ) return -1; 
     else if (o1.getValue() == o2.getValue() ) return 0; 
     return 1; 
    } 
} 
+0

luego me sale un error en la llamada para ordenar. '\t Establecer > mSet = Score.entrySet(); \t Objeto [] arr = mSet.toArray(); \t Arrays.sort (arr, new ScoreComp()); ' –

+0

No, esto no funcionará, porque las rutinas' TreeMap' no pasarán en los valores 'Map.Entry', no importa cuánto intente hacer compila – skaffman

+0

y el código en mi pregunta estaba compilando con una versión 6.5 de netbeans en Windows. pero no compila en netbeans 6.8 en linux. (java es 1.6 en ambos - extraño) –

4

Suponiendo que usted está usando este comparador para ordenar una TreeMap, entonces esto no va a funcionar. Los comparadores TreeMap son para comparar solo las claves de mapa, no las entradas de valor de clave->. Si su comparador necesita acceder a los valores, tendrá que buscarlos en el mapa, p.

final Map<Integer, Double> map = .... 

public class ScoreComp implements Comparator<Integer> { 
    public int compare(Integer key1, Integer key2) { 
    Double x = map.getValue(); 
    Double y = map.getValue(); 
    if (x < y) 
     return -1; 
    else if (x == y) 
     return 0; 
    else 
     return 1; 
    } 
} 

edición: Desde sus comentarios, creo que su mejor opción es crear una clase que encapsula el identificador y el valor, poner esos valores en una lista, y ordenar eso.

public class Item implements Comparable<Item> { 
    int id; 
    double value; 

    public int compareTo(Item other) { 
     return this.value - other.value; 
    } 
} 

y luego

List<Item> list = new ArrayList<Item>(); 
// ... add items here 
Collections.sort(list); 

Desde ItemComparable es en sí mismo, que no necesita una Comparator externa (a menos que quiera uno).

+0

¿Qué sucede si tengo que ordenar en base a los valores y los valores no son únicos para que las claves tengan que ser enteros y quiero mantener la clave y el valor juntos, para que mi código parezca fácil comprender. –

+0

¿Estás usando los valores enteros para algo? ¿Quién no acaba de poner los dobles en una lista, y ordenar eso? – skaffman

+0

después de ordenar los valores dobles que necesito para poder identificar qué valor doble pertenece a cada id. http://stackoverflow.com/questions/2145853/java-treemap-get-values-in-sorted-order –