Map的遍历方式和排序

Java中Map的遍历主要有三种方式:keySet 循环遍历、 entrySet() 循环遍历(尤其是容量大的时候)、values 循环遍历但是只能访问到values;

代码如下:

package map.traverse;

import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by Administrator on 2017/3/30.
 */
public class TraverseMap {

    /**
     * 这是第一种方式keySet
     */
    @Test
    public void traverseByKeySet() {
        System.out.println("keySet:");
//        Set<String> keySet = map.keySet(); // 发现了keySet遍历的是key
        Map<String, Object> map = getMap();
        for (String keySet : map.keySet()) {
            System.out.println(keySet + ":" + map.get(keySet));
        }
	//Iterator迭代器是通用的
        System.out.println("=============================================");
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
    }

    /**
     * 这是第二种方式entrySet
     */
    @Test
    public void traverseByEntrySet() {
        Map<String, Object> map = getMap();
//        Set<Map.Entry<String, Object>> entrySet = map.entrySet(); // 发现了entrySet遍历的是key_value键值对的set
        System.out.println("entrySet:");
        for (Map.Entry<String, Object> entrySet : map.entrySet()) {
            System.out.println(entrySet.getKey() + ":" + entrySet.getValue());
        }

        System.out.println("=================================================");
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            System.out.println(next.getKey() + ":" + next.getValue());
        }
    }

    @Test
    public void traverseByValues() {
        Map<String, Object> map = getMap();
//        Collection<Object> values = map.values(); // Collection
System.out.println("values:"); int i = 1; for (Object value : map.values()) { System.out.println((i++) + ":" + value); } } private Map<String, Object> getMap() { Map<String, Object> map = new HashMap<>(); map.put("a", "aaaaaa"); map.put("b", "bbbbbb"); map.put("c", "cccccc"); map.put("d", "dddddd"); map.put("e", "eeeeee"); map.put("f", "ffffff"); map.put("g", "gggggg"); return map; }}

Map的排序可以根据Key排序,也可以根据value排序,但是首先的知道Map的实现类有四种一个是HashMap、HashTable、TreeMap、LinkedHashMap,简单的说一下几者的区别吧,在这里吐槽一下关于中国教育书籍的编写问题,本来我以为可以查询java程序设计的教材可以查到该问题,但是发现java程序设计的教材中只是简单的介绍了散列数据结构,并没有更多说明,这也难怪中国无数大学生毕业意味失业的事实了。最后只能查看别人的博客了,感谢那些分享的人。

1.HashMap 是最常见的,它的value可以为null,key只能允许一个为null,非线程安全,无序的也不会保持插入时顺序;

2.HashTable 的key和value都不能为null,是线程安全的,其他和HashMap相当;

3.TreeMap 不允许value的值为null,是有序的,也是线程不安全的,默认是按照key排序(所以Map的排序用该实现);

4.LinkedHashMap 是HashMap的子类,它和HashMap的区别是可以保持插入的顺序,所以遍历时比HashMap要慢,Key和Value都可为null,也是非线程安全的。

要实现Map排序是需要重写Comparator即可,代码如下:

package map.traverse.sort;

import map.traverse.TraverseMap;
import org.junit.jupiter.api.Test;

import java.util.*;

/**
 * Created by Administrator on 2017/3/30.
 */
public class SortMap {

    private TraverseMap traverse = new TraverseMap();

    @Test
    public void sortByKey() {
        //默认是按照key升序排序的
        Map<String, Object> map1 = new TreeMap<>();
        printMap1(map1);
        System.out.println("===================================");
        // 现在改成降序
        Map<String, Object> map2 = new TreeMap<>((o1, o2) -> o2.compareTo(o1));
        printMap1(map2);
    }

    private void printMap1(Map<String, Object> map) {
        map.put("b", 222);
        map.put("f", 666);
        map.put("a", 111);
        map.put("g", 777);
        map.put("h", 888);
        map.put("e", 555);
        map.put("c", 333);
        map.put("d", 444);
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

    @Test
    public void sortByValue() {
        Map<String, Integer> map = new TreeMap<>();
        map.put("b", 222);
        map.put("f", 666);
        map.put("a", 111);
        map.put("g", 777);
        map.put("h", 888);
        map.put("e", 555);
        map.put("c", 333);
        map.put("d", 444);
        Map<String, Object> treeMap = new TreeMap<String, Object>(new MyCompare(map));
        treeMap.putAll(map);
        printMap2(treeMap);
    }

    private void printMap2(Map<String, Object> map) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

    class MyCompare implements Comparator {

        private Map<String,? extends Comparable> map;

        public MyCompare(Map map) {
            this.map = map;
        }

        @Override
        public int compare(Object o1, Object o2) {
            return map.get(o2).compareTo(map.get(o1));
        }
    }
}

感谢这几篇文章的作者:

http://www.cnblogs.com/chenssy/p/3264214.html;

http://blog.csdn.net/wangtao6791842/article/details/12904467


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发哥随手记

你的鼓励将是我创作的最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值