Java的Map操作

214 阅读1分钟
Map操作

      将对象映射到其他对象的能力是一种解决编程问题的杀手锏。例如,考虑一个程序,它将用来检查Java的Random类的随机性。理想状态下,Random可以将产生理想的数字分布,但要想测试它,则需要生成大量的随机数,并对落入各种不同范围的数字进行计数。Map可以很容易地解决该问题。在本例中,键是由Random产生的数字,而值是该数字出现的次数。

package p10;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Statistics {
    public static void main(String[] args) {
        Random rand = new Random(47);
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < 10000;i++){
            // Produce a number between 0 and 20
            int r = rand.nextInt(20);
            Integer freq = map.get(r);
            map.put(r,freq == null?1:freq+1);
        }
        System.out.println(map);
        /**
         * {0=481, 1=502, 2=489, 3=508, 4=481, 5=503, 6=519, 7=471, 8=468, 9=549,
         * 10=513, 11=531, 12=521, 13=506, 14=477, 15=497, 16=533, 17=509, 18=478, 19=464}
         */
    }
}

      在main()中,自动包装机制将随机生成的int转换为HashMap可以使用的Integer引用(不能使用基本类型的容器)。如果键不在容器中,get0方法将返回null(这表示该数字第一次被找到)。否则,get()方法将产生与该键相关联的Integer值,然后这个值被递增(自动包装机制再次简化了表达式,但是确实发生了对Integer的包装和拆包)。

      下面的示例允许你使用一个String描述来查找Pet,它还展示了你可以使用怎样的方法通过使用containsKey()和containsValue()来测试一个Map,以便查看它是否包含某个键或某个值。

package p10;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class PetMap {
    public static void main(String[] args) {
        Map<String,Pet> petMap = new HashMap<>();
        petMap.put("My Cat",new Cat("Molly"));
        petMap.put("My Dog",new Dog("Ginger"));
        petMap.put("My Hamster",new Hamster("Bosco"));
        System.out.println(petMap);
        Pet dog = petMap.get("My Dog");
        System.out.println(dog);
        System.out.println(petMap.containsKey("My Dog"));
        System.out.println(petMap.containsValue(dog));
        /**
         * {My Dog=Dog Ginger, My Cat=Cat Molly, My Hamster=Hamster Bosco}
         * Dog Ginger
         * true
         * true
         */
    }
}

      Map与数组和其他的Collection一样,可以很容易地扩展到多维,而我们只需将其他设置为Map(这些Map的值可以使其他容器,甚至可以是其他Map)。因此,我们能够很容易地将容器组合起来从而快速地生成强大的数据结构。例如,假设你正在跟踪拥有多个宠物的人,你所需的只是一个Map<Person,List>