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