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
会发生什么 - 如果我检查它,我仍然发现它没有被排除!由于列表是由地图实体集中的“按引用复制”创建的,因此列表中的更改不应反映在地图上吗?
答案 0 :(得分:3)
由于列表是由&#34创建的;通过引用复制&#34;从地图的实体集中,不应该是列表中的变化反映在地图上吗?
总之 - 没有。
该列表包含与条目集相同的引用,但它是一个不同的对象。更改列表(例如对其进行排序,添加或删除元素)将不影响条目集。但是,如果您通过列表访问特定条目并对其进行修改,您将观察到地图中的条目也已被修改,因为如您所述,列表和地图都包含相同的参考强>
答案 1 :(得分:1)
问题在于:
PostId
您正在使用与原始集包含的元素相同的元素创建新的List<Entry<String,Integer>> list = new ArrayList<Entry<String,Integer>>(set);
并对其进行排序。但是您要对新列表进行排序,而不是原始集。
另外,你想要实现什么目标? List
不需要保存元素顺序,因此您无法对Set
个键进行排序。您可以使用Map
- 它存储迭代顺序。