2
import java.util.*;

public class Sort {

    static class ValueComparator implements Comparator<String> {

        Map<String, Integer> base;

        ValueComparator(Map<String, Integer> base) {
            this.base = base;
        }

        @Override
        public int compare(String a, String b) {
            if (base.get(a) >= base.get(b)) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
        map.put("A", 1);
        map.put("B", 2);
        sorted.putAll(map);
        for (String key : sorted.keySet()) {
            System.out.println(key + " : " + sorted.get(key)); // why null values here?
        }
        System.out.println(sorted.values()); // But we do have non-null values here!
    }
}

出力:

A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)

2 番目のコメント行で示されているように、null 以外の値があるのに、最初のコメント行で null 値を取得するのはなぜだろうか。

編集: @null のバージョンは動作していないようです。次のようにコードを変更しました。

        public int compare(String a, String b) {
            if (a.equals(b)) return 0;
            if (base.get(a) >= base.get(b)) {
                return 1;
            } else return -1;
        }

うまくいくようですが、よくわかりません。

4

3 に答える 3

11

私の推測では、ValueComparator.compare()メソッドが 0 を返すことはなく、等しいことを示しているため、Map.get()メソッドは一致を見つけられません。

于 2012-12-12T15:20:44.030 に答える
2

この方法で比較を変更します

public int compare(String a, String b) {
        if (base.get(a) > base.get(b)) {
            return 1;
        }else if(base.get(a) ==  base.get(b)){
            return 0;
        }
        return -1;  
    }
于 2012-12-12T15:26:12.117 に答える
2

間違いなく壊れている Comparator でも、次のように変更すればプログラムは動作します。

for (Map.Entry e : sorted.entrySet()) {
    System.out.println(e.getKey() + " : " + e.getValue());
}
于 2012-12-12T15:32:11.803 に答える