在做报表的时候遇到从数据库查询数据已经做了排序,取出返回前台展示却是乱序的问题。经过调试发现由于数据库查回返回的数据放到了HashMap中,HashMap会根据其中的key的hashcode和equals方法进行重新排序,从而导致顺序变化问题,为了解决该问题改用LinkedHashMap。LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序。
HashMap的例子
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);
}
}
输出:
bb
cc
aa
LinkedHashMap例子:
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("a3", "aa");
map.put("a2", "bb");
map.put("b1", "cc");
for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
String name = (String) iterator.next();
System.out.println(name);
}
}
输出:
aa
bb
cc
但是问题仍未完全解决,因为中间将LinkedHashMap转成了json字符串,然后用fastjson转json对像进一步处理数据。这里的底层会默认采用hashmap的那一套对map数据又重新排序一次。为了避免这个问题查了下网上的资料,解决方案如下(json为输入的json字符串):
JSONObject jsonObj = new JSONObject(true);
Map m= jsonObj.parseObject(json, LinkedHashMap.class);
但是输出问题还是存在第二层以后排序混乱,如下:
传入Json:
{“t1”:"",“t3”:"",“t2”:{“a1”:"",“a3”:"",“a2”:""}}
输出:
{t1=, t3=, t2={“a1”:"",“a2”:"",“a3”:""}}
解决第二层重新排序的办法(json为输入的json字符串):
HashMap m=JSON.parseObject(json,LinkedHashMap.class,Feature.OrderedField);
传入Json:
{“t1”:"",“t3”:"",“t2”:{“a1”:"",“a3”:"",“a2”:""}}
输出结果:
{t1=, t3=, t2={“a1”:"",“a3”:"",“a2”:""}}
本文参考:
https://blog.csdn.net/leiyong0326/article/details/52948219
http://inlhx.iteye.com/blog/2312512