我有这个代码。它应该按整数值对映射进行排序。

public class Main {

    public static void main(String[] args) {

        HashMap<String,Integer> map = new HashMap<>();
        ValueComparator bvc =  new ValueComparator(map);
        TreeMap<String,Integer> sorted_map = new TreeMap<>(bvc);

        map.put("A",5);
        map.put("B",4);
        map.put("C",4);
        map.put("D",2);

        System.out.println("unsorted map: "+map);

        sorted_map.putAll(map);

        System.out.println("results: "+sorted_map);


    }
}

class ValueComparator implements Comparator<String> {

    Map<String, Integer> base;
    public ValueComparator(Map<String, Integer> base) {
        this.base = base;
        System.out.println("Map: " + base);
    }

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


而且效果很好。
但是首先作为ValueComparator实例的参数,我给构造函数提供一个空的hashmap。并将此空图保存在基础中。然后,我使用比较器创建树形图。然后,我将这些内容放入地图中,它会自动更新ValueComparator中称为base的引用。为什么传递给ValueComparator的地图会自动更新?实际上,基本变量应该仍然是一个空映射。是不是

最佳答案

实际上,基本变量应该仍然是一个空映射。是不是

不,您拨打ValueComparator bvc = new ValueComparator(map);的那一刻

由于this.base = base;,地图和底图都引用同一个对象

上面的理由说明了为什么会发生“然后我将内容放入地图中,并且它会自动更新ValueComparator中称为base的引用”。

07-24 09:21