Map的一种使用

在Thinking in java中的11.10小节开始,介绍了这么一个例子: 如何检查Java的Random类的随机性,即对落入不同范围的数字进行计数。

Random rand = new Random(47);
		Map<Integer, Integer> m = new HashMap<Integer, Integer>();
		for (int i = 0; i < 1000; i++) {
			int r = rand.nextInt(20);
			Integer freq = m.get(r);
			m.put(r, freq == null ? 1 : freq + 1);
		}
		System.out.println(m);

 在我的电脑上运行的结果是:

 

{0=42, 1=44, 2=53, 3=43, 4=44, 5=53, 6=42, 7=53, 8=46, 9=56, 10=58, 11=55, 12=48, 13=55, 14=52, 15=50, 17=50, 16=53, 19=52, 18=51}

 

对代码的解释: 如果键不在容器中,get方法将返回null(表示该值第一次被找到)。否则,get方法将返回与键关联的Integer值,并且这个值递增(+1)。 当然,代码中有自动包装机制(这是JDK1.5的新特性)。

 

现在假设你有一个职员列表(假设只有名字),列表中可能具有相同的名字,找出相同的名字在列表中出现的次数。

这时可以使用上面介绍的方法,但是需要获得java的键值对视图,找出那些数值大于1的name。

private void findSameName(List<String> nameList) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		for (String name : nameList) {
			map.put(name, map.get(name) == null ? 1 : map.get(name) + 1);
		}
		Set<Map.Entry<String, Integer>> set = map.entrySet();
		for (Map.Entry<String, Integer> entry : set) {
			int num = entry.getValue().intValue();
			String name = entry.getKey();
			if (num > 1) {
				System.out
						.println("this file has the same name, that name is ["
								+ name + "], it was found " + num + " times.");
			}
		}
	}
 

假设你为这个方法传递一个namelist: a,a,b,c,c,c,d,e,f,g,h

在我的电脑上的输出为:

this file has the same name, that name is [c], it was found 3 times.
this file has the same name, that name is [a], it was found 2 times.

 

Map与数组和其他的Collection一样,可以很容易的扩展到多维,例如你跟踪拥有多个宠物的人,你可以这样设置

Map<Person, List<? extends Pet>
 

你可能感兴趣的:(java,map)