对HashMap集合的值中对象进行排序

您所在的位置:网站首页 hashmap如何按照key排序 对HashMap集合的值中对象进行排序

对HashMap集合的值中对象进行排序

#对HashMap集合的值中对象进行排序| 来源: 网络整理| 查看: 265

问题

 对一个key为Integet, value为User对象  (User对象中有name和age属性)  的HashMap 通过User的age属性进行倒序排序

 你怎么排?   如果不用TreeMap可以排出来吗?   返回值需要是HashMap类型你怎么弄?

 

第一步   构建User对象 以及HashMap集合

static class User { int age; String name; public User(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\'' + '}'; } } static HashMap map = new HashMap() {{ this.put(7, new User(3, "面筋哥")); this.put(1, new User(2, "王花花")); this.put(5, new User(5, "栓蛋")); this.put(4, new User(1, "张三丰")); this.put(2, new User(4, "寒王")); }};

 

第二步   排序算法1  通过TreeMap排序

private static void sortedTreeMap() { // 创建 TreeMap 自定义比较器 TreeMap tree = new TreeMap(((o1, o2) -> Integer.compare(map.get(o2).age, map.get(o1).age))); // 遍历原 Map 添加到 TreeMap map.forEach((k, v) -> { tree.put(k, v); }); // 得到排序结果 tree.forEach((k, v) -> { System.out.println(k + ": " + v); }); }

 

第三步   排序算法2 通过StreamApi 排序

private static void sortedStream() { // 将 map 转化为 tream流 map.entrySet().stream() // 进行排序 .sorted(Collections.reverseOrder(Map.Entry.comparingByValue((o1, o2) -> Integer.compare(o1.age, o2.age)))) // 遍历排序结果 .forEach(System.out::println); }

 

第四步   排序算法3***  最好的答案

 HashMap是通过hash码进行分桶, 那么值肯定是乱的, 就算排序完毕重新放进去也是乱的, 但是HashMap有个

 子类 LinkedHshMap 

 LinkedHshMap 内部维持了一个双向链表,  可以保持顺序  既然让返回HashMap  那么就可以用到它

/** * List + Connections + linkedHashMap 排序 */ private static void sortLinkedHashMap() { // 先将 Map 的值放到 List 集合中 ArrayList list = new ArrayList(map.entrySet()); // 通过 Collections 的 sort 方法进行排序 Collections.sort(list, (o1, o2) -> Integer.compare(o2.getValue().age, o1.getValue().age)); // 到这里list已经排序完了 将 List 的数据放到 LinkedHashMap 中 LinkedHashMap linkedHashMap = new LinkedHashMap() {{ list.forEach((s) -> { this.put(s.getKey(), s.getValue()); }); }}; // 遍历排序结果 linkedHashMap.forEach((k, v) -> { System.out.println(k + ": " + v); }); }

 

 第五步   测试结果

A:\Work\jdk1.8\bin\java.exe ... 5=User{age=5, name='栓蛋'} 2=User{age=4, name='寒王'} 7=User{age=3, name='面筋哥'} 1=User{age=2, name='王花花'} 4=User{age=1, name='张三丰'} 5: User{age=5, name='栓蛋'} 2: User{age=4, name='寒王'} 7: User{age=3, name='面筋哥'} 1: User{age=2, name='王花花'} 4: User{age=1, name='张三丰'} 5: User{age=5, name='栓蛋'} 2: User{age=4, name='寒王'} 7: User{age=3, name='面筋哥'} 1: User{age=2, name='王花花'} 4: User{age=1, name='张三丰'} Process finished with exit code 0

 

结束

  这就是对本题的讲解  可能不是特别好的方法  感觉有用就点个赞吧 如果有错误或更好的方法评论区请多多指出  相互学习共同进步



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3