2012-10-18 22 views
19

Ho bisogno di un comparatore per una TreeMap. Dovrei scrivere questo in modo anonimo nel costruttore per la mia TreeMap? In quale altro modo potrei scrivere il mio comparatore. Attualmente, Java non piace il mio codice (posso fare questo in modo anonimo?):Comparatore Java TreeMap

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<Entry<String, Double>>() 
    { 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) 
     { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
  1. Posso fare quanto sopra anonimo?
  2. In quale altro modo posso fare questo?
  3. voglio ordinare myMap dal Valore non la chiave

risposta

42

non è possibile ordinare TreeMap sui valori.

Un'implementazione NavigableMap basata su albero rosso-nero. La mappa viene ordinata in base all'ordinamento naturale delle sue chiavi o da un comparatore fornito al momento della creazione della mappa, a seconda del costruttore utilizzato È necessario fornire comparator per Comparator<? super K> in modo che il comparatore debba comparare sulle chiavi.

Per fornire i valori di ordinamento è necessario SortedSet. Utilizzare

SortedSet<Map.Entry<String, Double>> sortedset = new TreeSet<Map.Entry<String, Double>>(
      new Comparator<Map.Entry<String, Double>>() { 
       @Override 
       public int compare(Map.Entry<String, Double> e1, 
         Map.Entry<String, Double> e2) { 
        return e1.getValue().compareTo(e2.getValue()); 
       } 
      }); 

    sortedset.addAll(myMap.entrySet()); 

Per darvi un esempio

SortedMap<String, Double> myMap = new TreeMap<String, Double>(); 
    myMap.put("a", 10.0); 
    myMap.put("b", 9.0); 
    myMap.put("c", 11.0); 
    myMap.put("d", 2.0); 
    sortedset.addAll(myMap.entrySet()); 
    System.out.println(sortedset); 

uscita:

[d=2.0, b=9.0, a=10.0, c=11.0] 
+0

Come si aggiunge un elemento uno alla volta a myMap? myMap.add (Map.Entry new Map.Entry (vStr, cur)); – CodeKingPlusPlus

+0

@CodeKingPlusPlus No. si utilizza solo il metodo put Controllare l'esempio che viene aggiunto. Metti i valori su Map una volta che hai finito usa SortedSet per ordinare i valori. –

+0

@AmitDeshpande grazie per la risposta superba – Kushal

11

Il comparatore dovrebbe essere solo per la chiave, non per l'intera voce. Ordina le voci in base ai tasti.

si dovrebbe cambiare in qualcosa come segue

SortedMap<String, Double> myMap = 
    new TreeMap<String, Double>(new Comparator<String>() 
    { 
     public int compare(String o1, String o2) 
     { 
      return o1.compareTo(o2); 
     } 
}); 

Aggiornamento

Si può fare qualcosa nel modo seguente (creare un elenco di voci nella mappa e ordinare la base di lista sul valore, ma notare che questo non andando a ordinare la mappa stessa) -

List<Map.Entry<String, Double>> entryList = new ArrayList<Map.Entry<String, Double>>(myMap.entrySet()); 
    Collections.sort(entryList, new Comparator<Map.Entry<String, Double>>() { 
     @Override 
     public int compare(Entry<String, Double> o1, Entry<String, Double> o2) { 
      return o1.getValue().compareTo(o2.getValue()); 
     } 
    }); 
+0

@CodeKingPlusPlus: non è possibile ordinare la mappa stessa in base ai valori. Ma puoi ottenere l'elenco delle voci e ordinarlo. Ma potrebbe non avere senso avere una TreeMap, a meno che non si cambi la chiave e il valore. –

0

È possibile scorrere la chiave e il valore. Ad esempio

 String[] k = {"Elena", "Thomas", "Hamilton", "Suzie", "Phil"}; 
     int[] v = {341, 273, 278, 329, 445}; 
     TreeMap<Integer,String>a=new TreeMap(); 
     for (int i = 0; i < k.length; i++) 
      a.put(v[i],k[i]);    
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
     a.remove(a.firstEntry().getKey()); 
     System.out.println(a.firstEntry().getValue()+"\t"+a.firstEntry().getKey()); 
+1

Questo sta cercando di risolvere l'ultima domanda, ma non i primi due. –

Problemi correlati