Map根据键、值进行排序

简介: 在参加农行软开笔试时,最后一道编程题需要将Map中的数据按照值排序··· ···

1、Map的遍历方式

keySet() 和 entrySet() 两种方式

keySet():通过该方法可以获取 Map 中的全部 key 值,返回的是一个 set 集合。

entrySet(): Entry 是 Map 底层中数组中存储的数据节点,Entry表示了一对键和值。

Map<String, Integer> map = new HashMap<>();
map.put("zhangsan", 10);
map.put("lisi", 8);
map.put("wangwu", 18);

//1.使用keySet
Set<String> keySet = map.keySet();
//1.1 使用迭代器
Iterator<String> setIterator = keySet.iterator();
while(setIterator.hasNext()) {
    String key = setIterator.next();
    Object value = map.get(key);
    System.out.println("1.1:::key::" + key + "::value::" + value);
}
        
//1.2 使用增强for遍历set集合
for(String key:keySet) {
    System.out.println("1.2:::key::" + key + "::value::" + map.get(key));
}
        
//2. 使用entrySet
Set<Entry<String, Integer>> entrySet = map.entrySet();
//2.1 使用迭代器
Iterator<Map.Entry<String, Integer>> iterator2 = entrySet.iterator();
while(iterator2.hasNext()) {
    Map.Entry<String, Integer> entry = iterator2.next();
    System.out.println("2.1:::key::" + entry.getKey() + "::value::" + entry.getValue());
}
//2.2 使用for循环
for(Entry<String, Integer> entry:entrySet) {
    System.out.println("2.2:::key::" + entry.getKey() + "::value::" + entry.getValue());
}

2、Map根据键、值进行排序

根据 entrySet() 得到 Map.Entry 节点的 Set 集合,接着将其转换为 list ,然后对 list 排序即可。

2.1 根据 Value 由大到小排序
Map<String, Integer> map = new HashMap<>();
map.put("zhangsan", 10);
map.put("lisi", 8);
map.put("wangwu", 18);
//得到Map中的Entry节点
Set<Map.Entry<String, Integer>> set = map.entrySet();  
//将Set转换为List类型
List<Map.Entry<String, Integer>> list = new ArrayList<Entry<String,Integer>>(set); 
//对list中的数据根据Value值进行排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return (o2.getValue() - o1.getValue());  //降序排序
    } 
});
//list是排完序的
for(Map.Entry<String, Integer> t:list) { 
    System.out.println(t.getKey() + "::" + t.getValue()); 
}
2.2 根据 key 由大到小排序
Map<Integer, Integer> map = new HashMap<>();
map.put(2, 10);
map.put(10, 8);
map.put(1, 18);

Set<Map.Entry<Integer, Integer>> set = map.entrySet();
List<Map.Entry<Integer, Integer>> list = new ArrayList<Entry<Integer,Integer>>(set); 
Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
    public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
        return (o2.getKey() - o1.getKey());   //降序排序
    } 
});
for(Map.Entry<Integer, Integer> t:list) { 
    System.out.println(t.getKey() + "::" + t.getValue()); 
}

3、TreeMap

HashMap 是 以空间换时间 的映射表,它内部的 Key 是无序的。

SortedMap 在内部会对 Key 进行排序,SortedMap 是一个接口,实现类是 TreeMap。但是需要注意的是,使用TreeMap 时,放入的 Key 必须实现 Comparable 接口,String、Integer这些类已经实现了 Comparable 接口。如果作为 Key 的 class 没有实现 Comparable 接口,在创建 TreeMap 时同时指定一个自定义排序算法。

参考文章:

Map的底层实现原理

hashMap根据value排序

面试回答之HashMap

使用TreeMap

相关文章
|
6月前
|
Go
go map进行有序的排序
go map进行有序的排序
52 0
|
1月前
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
18 0
|
6月前
|
算法 测试技术 C#
【map】【单调栈 】LeetCode768: 最多能完成排序的块 II
【map】【单调栈 】LeetCode768: 最多能完成排序的块 II
|
6月前
|
存储 JavaScript 前端开发
JavaScript实现Map并排序
JavaScript实现Map并排序
123 0
|
6月前
|
C++
c++ set、map的四种自定义排序方法
c++ set、map的四种自定义排序方法
317 0
|
6月前
|
算法 测试技术 C++
【map】【单调栈 】LeetCode768: 最多能完成排序的块 II
【map】【单调栈 】LeetCode768: 最多能完成排序的块 II
|
存储 自然语言处理 数据可视化
按Value对Map进行排序,技术大佬们都在用这个方法
在Java中,Map的排序一般会根据Key或者Value来进行。按照Value对Map进行排序,通常会用在以下几种场景。
|
存储 C++ 容器
<C++>map 容器快速上手|自定义数据类型排序的避坑理解(下)
<C++>map 容器快速上手|自定义数据类型排序的避坑理解
306 0
<C++>map 容器快速上手|自定义数据类型排序的避坑理解(下)
|
Go
go map进行有序的排序
go map进行有序的排序
106 0
|
前端开发 JavaScript
js对map排序,后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法
在后端进行时间倒序查询后,返回map类型的数据,在postman获取是这样:
534 0