将对象映射到其他对象的能力是一种解决问题的杀手锏。
解决问题1:使用map解决Random取值次数进行计数:
//10000次中,随机数0-20会出现的次数为map中的value,key为当前随机数
public class MapRandom {
public static void main(String[] args) {
Random rand = new Random(47);
Map<Integer,Integer> m = new HashMap<>();
for(int i=0;i<10000;i++){
int r = rand.nextInt(20);
Integer freq = m.get(r);
m.put(r, freq == null ? 1 : freq+1);
}
System.out.println(m);
}
}
解决问题2:使用map设置复杂的数据结构,查看拥有多个宠物的人
首先设置Pet类,Cat和Mouse继承自Pet:
public class Pet {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Pet(String name){
this.name = name;
}
}
class Cat extends Pet{
Cat(String name) {
super(name);
}
}
class Mouse extends Pet{
Mouse(String name) {
super(name);
}
}
接下来设置Person类:
public class Person {
private String name;
Person(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
最后设置MapOfList类,构造我们的数据结构
public class MapOfList {
public static void main(String[] args) {
Map<Person, List<? extends Pet>> petPeople = new HashMap<>();
petPeople.put(new Person("rainzhao"), Arrays.asList(new Cat("mao1"),new Mouse("shu1")));
petPeople.put(new Person("zhangsan"), Arrays.asList(new Cat("mao2"),new Mouse("shu2")));
for(Person person: petPeople.keySet()){
System.out.println(person.getName() + " has:");
for(Pet pet: petPeople.get(person)){
System.out.println(pet.getName());
}
}
}
}
/*输出结构为:
rainzhao has:
mao1
shu1
zhangsan has:
mao2
shu2
*/
这里解释一下泛型中的<? extends Pet>,?这里是代表类型不确定使用?来代替,当调用时会是你所传递的参数类型。这里为什么不直接写成<Pet>是因为我们所传入的List类型不确定,有可能是Cat也有可能是Mouse,但是其实这里直接设置为<Pet>也是不会报错的。具体有关泛型通配符的使用请移步:通配符的使用。