在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>