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


猜你喜欢

转载自blog.csdn.net/QQ70945934/article/details/68483809
今日推荐