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();
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; }}// Collection<Object> values = map.values(); // Collection
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