HashMap学习

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


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值