本例讲解对HashMap<Integer,User>的User对象中的age进行降序排序
第一步:创建一个User对象
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//方便打印输出
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
第二步:创建排序方法
/**
* 众所周知HashMap是无序
* 然而它的子类LinkedHashMap确是有序的(插入顺序),根据官方API说明他是按照插入顺序来的
* 如果新插入了重复值,那么插入顺序不变
* @param hashMap
* @return
*/
private static HashMap<Integer, User> sortHashMap(
HashMap<Integer, User> hashMap) {
//有序 插入顺序,所以只能返回HashMap(无序)的子类LinkedHashMap(有序)
LinkedHashMap<Integer, User> newHashMap=new LinkedHashMap<Integer, User>();
//把map转换为set集合
Set<Entry<Integer, User>> set = hashMap.entrySet();
//将set转换为List
ArrayList<Entry<Integer,User>> list = new ArrayList<>(set);
//但凡要对集合进行排序,首先想到就是集合工具类
/*Collections.sort(list, new Comparator<T>() {//这个泛型,应该写Entry<Integer, User>
});*/
Collections.sort(list, new Comparator<Entry<Integer, User>>() {
@Override
public int compare(Entry<Integer, User> o1, Entry<Integer, User> o2) {
//如果是降序 就用o2的值减01的值 升序反之
return o2.getValue().getAge()-o1.getValue().getAge();
}
});
//将排好序的list转换成LinkedHashMap
for(int i=0,len=list.size();i<len;i++){
Entry<Integer, User> entry=list.get(i);
newHashMap.put(entry.getKey(), entry.getValue());
}
return newHashMap;
}
在主函数中运行
public static void main(String[] args) {
HashMap<Integer, User> hashMap=new HashMap<Integer, User>();
User user=new User();
user.setName("张三");
user.setAge(11);
hashMap.put(1, user);
User user1=new User();
user1.setName("李四");
user1.setAge(22);
hashMap.put(2, user1);
User user2=new User();
user2.setName("王五");
user2.setAge(33);
hashMap.put(3, user2);
//排序前的haspMap
System.out.println("排序前:"+hashMap);
//排序后sortHashMap
HashMap<Integer, User> sortHashMap=sortHashMap(hashMap);
System.out.println("排序后:"+sortHashMap);
}
结果
如果还是用 LinkedHashMap 的话,从图中可以看到顺序是有改变的
如果还是用HashMap的话,从图中可以看到顺序是没有改变的