基础List <entry>中的更改未显示在父地图对象中?

时间:2015-04-23 15:16:05

标签: java sorting hashmap

public static void main(String[] args){

    Map<String, Integer> myMap = new HashMap<String, Integer>();
    myMap.put("a", 1);
    myMap.put("b", 7);
    myMap.put("c", 2);
    myMap.put("b", 5);

    List<Entry<String, Integer>> myList = mySort(myMap); //sort by map values!
    //myList is now sorted but myMap is not!
}

public List<Entry<String,Integer>> mySort(Map<String, Integer> map){        
    Set<Entry<String,Integer>> set = map.entrySet();
    List<Entry<String,Integer>> list = new ArrayList<Entry<String,Integer>>(set);       
    Collections.sort(list, new Comparator<Entry<String, Integer>>()
    {
        public int compare(Entry<String,Integer> o1, Entry<String, Integer> o2){
            return (o2.getValue()).compareTo(o1.getValue());
           }    
     }
    );      
    return list;        
} 

我的问题是 - 在我调用排序后(在main函数的最后一行),如果我打印我的列表,我看到它排序好了。但myMap会发生什么 - 如果我检查它,我仍然发现它没有被排除!由于列表是由地图实体集中的“按引用复制”创建的,因此列表中的更改不应反映在地图上吗?

2 个答案:

答案 0 :(得分:3)

  

由于列表是由&#34创建的;通过引用复制&#34;从地图的实体集中,不应该是列表中的变化反映在地图上吗?

总之 - 没有。

该列表包含与条目集相同的引用,但它是一个不同的对象。更改列表(例如对其进行排序,添加或删除元素)将影响条目集。但是,如果您通过列表访问特定条目并对其进行修改,您将观察到地图中的条目也已被修改,因为如您所述,列表和地图都包含相同的参考

答案 1 :(得分:1)

问题在于:

PostId

您正在使用与原始集包含的元素相同的元素创建新的List<Entry<String,Integer>> list = new ArrayList<Entry<String,Integer>>(set); 并对其进行排序。但是您要对新列表进行排序,而不是原始集。

另外,你想要实现什么目标? List不需要保存元素顺序,因此您无法对Set个键进行排序。您可以使用Map - 它存储迭代顺序。