我使用LinkedHashMap来存储按某些业务规则排序的映射条目,我将它发送到客户端,但我的AJAX响应总是按地图键排序。
我的排序功能:
protected Map<Long, String> sortWarehousesMap(Map<Long, String> warehousesMapTemp) {
List<Map.Entry<Long, String>> entries = new ArrayList<Map.Entry<Long, String>>(warehousesMapTemp.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<Long, String>>() {
public int compare(Map.Entry<Long, String> a, Map.Entry<Long, String> b) {
return a.getValue().compareTo(b.getValue());
}
});
Map<Long, String> sortedWarehousesMapTemp = new LinkedHashMap<Long, String>();
for (Map.Entry<Long, String> entry : entries) {
sortedWarehousesMapTemp.put(entry.getKey(), entry.getValue());
}
return sortedWarehousesMapTemp;
}
请帮助我,我做错了什么。
答案 0 :(得分:2)
我遇到了同样的问题,并且在FF中没有发生。
问题是返回的映射被解释为数组。
映射的键是Long(如果使用String但是使用整数值,例如“5”),因此结果是一个数组。
我的解决方案是在密钥前添加一个“_”以便有一个假密钥。
答案 1 :(得分:1)
你提到了一个AJAX响应,所以我假设在某些时候这被转换为JSON表示。当您使用Map时,这将转换为JSON对象,遗憾的是JSON规范不保证对象中属性的顺序(参见Does JavaScript Guarantee Object Property Order?),它实际上是未指定的。无论您使用哪种库在Java对象和JSON表示之间进行转换,都可能为您排序密钥。
如果绝对必须保留JSON中某些内容的顺序,则必须使用JSON数组。