web-dev-qa-db-ja.com

Java TreeMap Comparator

TreeMapのコンパレータが必要です。これをTreeMapのコンストラクターで匿名で記述する必要がありますか?他にどのようにコンパレータを書くことができますか。現在、Javaは私のコードが好きではありません(匿名でこれを行うことはできますか?):

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. 上記を匿名で行うことはできますか?
  2. 他にどのようにこれを行うことができますか?
  3. キーではなく値でmyMapをソートしたい
25

コンパレータは、エントリ全体ではなく、キーのみに使用する必要があります。キーに基づいてエントリをソートします。

次のように変更する必要があります

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

更新

次のようにできます(マップにエントリのリストを作成し、値に基づいてリストを並べ替えますが、マップ自体は並べ替えないことに注意してください)-

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());
        }
    });
13
Bhesh Gurung

キーと値をスワイプできます。例えば

        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());
0
ahmed soror