首先,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);
}
}
}
}