首先,Map和Set一样是无序的,Map中存储的是键值对,键(Key)是不能有重复的,而且一个键只能对应一个值(Value)。但是,一个值可以对应多个键。正是因为如此:
对于Map的KeySet()方法返回类型是Set,而Values()的返回类型是Collection。
HashMap是接口Map的一个实现类。
我们看一个例子:输入多个字符串,这些字符串可以有重复的,统计每个字符串出现的次数,并输入。使用HashMap实现。
package com.sailang.hashmap; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class MapTest { public static void main(String[] args) { //定义一个HashMap HashMap map = new HashMap(); //传入几个字符串,字符串中有重复的,统计每个字符串重复的次数,并打印 for(int i = 0; i < args.length; i++) { //判断字符串是否已经存在于HashMap中,如果不存在,直接放入。如果存在,将Value值加1再放入。再次放入的时候,会将以前的覆盖掉。 if(map.get(args[i]) == null) { map.put(args[i], new Integer(1)); } else { Integer in = (Integer)map.get(args[i]); in = new Integer(in.intValue() + 1); //替换掉以前,相同键值的项 map.put(args[i], in); } } //打印输出 //获得HashMap的Key集合(Set) Set set = map.keySet(); //使用迭代器,遍历Key集合,进而遍历所有的Value。 for(Iterator it = set.iterator(); it.hasNext();) { String key = (String)it.next(); Integer value = (Integer)map.get(key); System.out.println(key + ":" + value); } } }
输入为:android li zhong yi yi zhong li android
输出结果为:
li:2
zhong:2
android:2
yi:2
思路为:我们把字符串做为HashMap的键,将其出现的次数做为HashMap的值。
遍历Map的两种方法:
方法一:
上面程序中使用的就是方法一,使用Map的keySet()方法。
方法二:
看下面程序的遍历方法,使用Map的entrySet()方法。
题目:
随机生成50个整数,每个数字的范围是[10,50],统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,如果某个数字出现次数为0,则不要打印它。打印时按照数字的升序排列。
最好的方法是使用集合进行实现:
方法一:采用Map+List的方法
package com.sailang.hashmap; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class Statistics1 { public static void main(String[] args) { Map map = new HashMap();//将随机生成的数,放到HashMap中,数字本身作为Key,个数作为Value for(int i = 0; i < 50; i++) { int randomData = (int)(Math.random() * 41 +10); Integer Key = new Integer(randomData); if(map.get(Key) == null) { map.put(Key, new Integer(1)); } else { Integer in = (Integer)map.get(Key); in = new Integer(in.intValue() + 1); map.put(Key, in); } } /* * 排序 */ //将键值对封装到List中 List list = new ArrayList(map.entrySet()); //按键值进行排序 Collections.sort(list, new Comparator(){ public int compare(Object arg0, Object arg1) { Map.Entry entry1 = (Map.Entry)arg0; Map.Entry entry2 = (Map.Entry)arg1; return ((Integer)entry1.getKey()).intValue() - ((Integer)entry2.getKey()).intValue(); } }); System.out.println("排序之后的统计结果:"); //输出 for(Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println(key + ":" +value); } /* * 寻找出现次数最多的 */ System.out.println("出现次数最多的统计结果:"); Map.Entry MaxValueEntry = (Map.Entry)Collections.max(list, new Comparator(){ public int compare(Object arg0, Object arg1) { Map.Entry entry1 = (Map.Entry)arg0; Map.Entry entry2 = (Map.Entry)arg1; return ((Integer)entry1.getValue()).intValue() - ((Integer)entry2.getValue()).intValue(); } }); for(Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); if(((Integer)MaxValueEntry.getValue()).intValue() == ((Integer)entry.getValue()).intValue()) { Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println(key + ":" +value); } } } }
方法二:使用带排序的Map,即TreeMap
package com.sailang.hashmap; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.TreeMap; public class Statistics2 { public static void main(String[] args) { Map map = new TreeMap();//用于存放随机生成的数及出现的次数,<key=数字,value=出现次数> Random random = new Random(); for(int i = 0; i < 50; i++) { int randomNumber = random.nextInt(41) + 10; Integer key = new Integer(randomNumber); if(map.get(key) == null) { map.put(key, new Integer(1)); } else { Integer value = (Integer)map.get(key); value = new Integer(value.intValue() + 1); map.put(key, value); } } Set set = map.entrySet(); for(Iterator it = set.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println(key + ":" + value); } /* * 寻找出现次数最多的 */ System.out.println("出现次数最多的统计结果:"); Collection coll = map.values(); Integer maxNumber = (Integer)Collections.max(coll); for(Iterator it = set.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry)it.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); if(maxNumber.intValue() == value.intValue()) { System.out.println(key + ":" + value); } } } }