將對象映射到其他對象的能力是一種解決問題的殺手锏列敲。
解決問題1:使用map解決Random取值次數(shù)進(jìn)行計(jì)數(shù):
//10000次中俊扭,隨機(jī)數(shù)0-20會(huì)出現(xiàn)的次數(shù)為map中的value妨退,key為當(dāng)前隨機(jī)數(shù)
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設(shè)置復(fù)雜的數(shù)據(jù)結(jié)構(gòu)赠涮,查看擁有多個(gè)寵物的人
首先設(shè)置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);
}
}
接下來設(shè)置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;
}
}
最后設(shè)置MapOfList類,構(gòu)造我們的數(shù)據(jù)結(jié)構(gòu)
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());
}
}
}
}
/*輸出結(jié)構(gòu)為:
rainzhao has:
mao1
shu1
zhangsan has:
mao2
shu2
*/
這里解釋一下泛型中的<? extends Pet>滑废,草描?這里是代表類型不確定使用?來代替策严,當(dāng)調(diào)用時(shí)會(huì)是你所傳遞的參數(shù)類型。這里為什么不直接寫成<Pet>是因?yàn)槲覀兯鶄魅氲腖ist類型不確定饿敲,有可能是Cat也有可能是Mouse妻导,但是其實(shí)這里直接設(shè)置為<Pet>也是不會(huì)報(bào)錯(cuò)的。具體有關(guān)泛型通配符的使用請移步:通配符的使用怀各。