java map 遍历 顺序_Java中Map的排序问题详解

Map的种类

在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别:

HashMap:

最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

TreeMap

实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

按键排序

从上面Map的种类介绍我们可以看出,TreeMap是自带按键排序的功能的,只需要在创建的时候同时实现一个Compare的接口就可以了,例子如下:

private static void sort_by_key(){

Map treeMap = new TreeMap<>(new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o2-o1; //倒序.这里说明一下,如果返回负值,则o1先输出,反之则o2

}

});

//填充数据

for(int i = 0; i < 100;i++){

int key = (int)(10000*Math.random());

int value = (int)(10000*Math.random());

treeMap.put(key, value);

}

outMap(treeMap);

}

public static void outMap(Map map){

for(Integer integer:map.keySet()){

System.out.println("key="+integer+" value="+map.get(integer));

}

}

/* 结果如下:

key=9977 value=80

key=9684 value=7108

key=9422 value=1706

key=9264 value=1210

key=9248 value=4758

key=9024 value=7048

key=8892 value=3124

key=8879 value=6414

key=8814 value=8171

key=8728 value=1538

key=8513 value=4956

key=8462 value=5617

key=8355 value=8912

*/

从上面可以看出,按键排序是不难的,而安置排序就比较麻烦一些,需要将Map转一下。

按值排序

由于Java中Map并没有此功能,所以我们需要自己实现。思路如下:

Java中List是可以使用compare接口的。

Map实际上就是Entry<>的集合

那么使用List>就可以实现排序

将排好序的元素再插入到LinkedMap中

代码实现如下:

private static Map sortMap(Map linkedMap) {

List> cache = new ArrayList<>(linkedMap.entrySet());

//重写比较函数

Collections.sort(cache,new Comparator>() {

@Override

public int compare(Entry o1, Entry o2) {

//若返回值小于0,则o1在o2前面

return o2.getValue()-o1.getValue();

}

});

Map resultMap = new LinkedHashMap<>();

//将结果插入LinkedMap然后返回

for(int i = 0; i < cache.size();i++){

resultMap.put(cache.get(i).getKey(), cache.get(i).getValue());

}

return resultMap;

}

/*结果:

7965 9966

1067 9963

1720 9833

3257 9738

3934 9578

777 9348

1924 9315

3472 9270

3649 9114

5892 9078

*/

这样,按值排序和按键排序就都可以实现了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,我们有多种方式来遍历Map。其三种常用的方式是: 1. 使用entrySet遍历:这种方式是最常用的方式之一。通过使用entrySet()方法,我们可以获取到Map的每一对键值对,然后通过for循环遍历得到每个键值对的key和value。这种方式比较通用且效率较高。 2. 使用keySet遍历:如果我们只需要获取Map的key或者value,可以使用keySet()方法获取Map所有的键,然后通过for循环遍历得到每个键对应的value。相比使用entrySet,这种方式在性能上会稍微好一些。 3. 使用Iterator遍历:如果我们想要使用一种更底层的方式来遍历Map,可以使用迭代器Iterator来遍历。通过调用entrySet().iterator()方法获取到一个迭代器,然后使用while循环和next()方法遍历Map的键值对。这种方式相比于前两种方式更加灵活,但是代码量相对会多一些。 在Java 8,还引入了一种新的非常方便的Map遍历方式,使用Lambda表达式可以更加简洁地遍历Map。通过调用Map的forEach方法,我们可以传入一个Lambda表达式,用来处理Map的每一个键值对。这种方式既简洁又高效,特别适合处理较大的Map。 综上所述,Java有多种方式可以用来遍历Map,我们可以根据具体的需求选择合适的方式来进行遍历。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Javamap遍历方式的选择问题详解](https://download.csdn.net/download/weixin_38713996/12771761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [javaMap遍历的三种方式](https://blog.csdn.net/m0_67390963/article/details/126392001)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JAVA8独有的map遍历方式(非常好用)](https://download.csdn.net/download/weixin_38707061/12744231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值