众所周知,java中Iterator、Collection和Map都是顶层接口。在遍历集合Collection时,可以使用迭代器Iterator,加快遍历速度。但是对于Map不是集合,内部不含有iterator,那么该如何遍历Map中的对象呢?
首先要明确,Map是将Key映射到Value的对象,每个键最多对应一个值,必须得保证key的唯一性。故当map中存在相同key时,值会被后者覆盖掉。而且Map不同于Collection存储单列元素,其存储的是双列元素,在没有迭代器的情况下,取出双列元素需要好好动动脑子。
这里用到map中的Set<k> keySet()、Set<Map.Entry<K,V>>entrySet()方法。前者返回map映射关系中所包含的key的视图(set集合),后者将键和值的映射关系作为对象存在set集合中,类型是Map.Entry(接口,含有 k getKey()、v getValue()、v setValue(v value)等方法)。
这样,通过将map转成set,就可以利用set集合中的迭代器获取到每一个键,在获取对应的值,进行输出打印。
以简单demo为例: “cbacbaa”获取该字符串的每一个字母出现次数,要求打印结果为a(3)b(2)c(2).
设计思想:分别用keySet和entrySet实现。
package cn.ishuai.p1.map; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class CountStr { public static void main(String[] args) { // TODO Auto-generated method stub String s="sdfsdff"; char []cha=s.toCharArray(); Map<Character,Integer>map=new TreeMap<Character,Integer>(); for(char i:cha){ Integer value=map.get(i); if(value==null) map.put(i, 1); else map.put(i, value+1); } keySetNum(map); entrySetNum(map);//两种不同遍历方式 } private static void entrySetNum(Map<Character, Integer> map) { // TODO Auto-generated method stub Set<Map.Entry<Character, Integer>>set=map.entrySet(); Iterator<Map.Entry<Character,Integer>>it=set.iterator(); while(it.hasNext()){ Map.Entry<Character,Integer>me=it.next(); Character cha=me.getKey(); Integer inte=me.getValue(); System.out.println(cha+"("+inte+")"); } } private static void keySetNum(Map<Character, Integer> map) { // TODO Auto-generated method stub Set<Character>set=map.keySet(); Iterator<Character> it=set.iterator(); while(it.hasNext()){ char cha=(char) it.next();//换成character Integer value=map.get(cha); System.out.println(cha+"("+value+")"); } } } 结果: a(3) b(2) c(2)