美文网首页
Map(学习java编程思想)

Map(学习java编程思想)

作者: 998584f56259 | 来源:发表于2016-10-25 13:18 被阅读34次

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

    import java.util.*;
    
    public class Statistics {
    public static void main(String[] args) {
      
    Random rand = new Random(47);
    
    Map<Integer,Integer> m = new HashMap<Integer,Integer>();
    
    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);
    }
    } /* Output:
    {15=497, 4=481, 19=464, 8=468, 11=531, 16=533, 18=478, 3=508, 7=471, 12=521, 17=509, 2=489, 13=506, 9=549, 6=519, 1=502, 14=477, 10=513, 5=503, 0=481}
    *///:~
    

    下面的示例允许你是用一个String描述来查找Pet对象,并且展示通过containsKey()和containsValue()来测试一个Map,以便查看它是否包含某个键或某个值。

    import java.util.*;
    import pets.Cat;
    import pets.Dog;
    import pets.Hamster;
    import pets.Pet;
    
    public class PetMap {
    public static void main(String[] args) {
      
    Map<String,Pet> petMap = new HashMap<String,Pet>();
    
    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));
    }
    } /* Output:
    {My Cat=Cat Molly, My Hamster=Hamster Bosco, My Dog=Dog Ginger}
    Dog Ginger
    true
    true
    *///:~
    

    Map与数组和其他的Collection一样,可以很容易地扩展到多维。因此,我们能够很容易地将容器组合起来从而快速地生成强大的数据结构。例如,假设我们调查拥有多个宠物的人,你所需的只是一个Map<Person,List<Pet>>。

    import java.util.*;
    
    import pets.Cat;
    import pets.Cymric;
    import pets.Dog;
    import pets.Mutt;
    import pets.Person;
    import pets.Pet;
    import pets.Pug;
    import pets.Rat;
    
    public class MapOfList {
    
    public static Map<Person, List<? extends Pet>>
    petPeople = new HashMap<Person, List<? extends Pet>>();
    
    static {
    petPeople.put(new Person("Dawn"),
      Arrays.asList(new Cymric("Molly"),new Mutt("Spot")));
    
    petPeople.put(new Person("Kate"),
      Arrays.asList(new Cat("Shackleton"),
        new Cat("Elsie May"), new Dog("Margrett")));
    
    petPeople.put(new Person("Marilyn"),
      Arrays.asList(
       new Pug("Louie aka Louis Snorkelstein Dupree"),
       new Cat("Stanford aka Stinky el Negro"),
       new Cat("Pinkola")));    
    
    petPeople.put(new Person("Luke"),
      Arrays.asList(new Rat("Fuzzy"), new Rat("Fizzy")));
    
    petPeople.put(new Person("Isaac"),
      Arrays.asList(new Rat("Freckly")));
    }
    
    public static void main(String[] args) {
      System.out.println("People: " + petPeople.keySet());
      System.out.println("Pets: " + petPeople.values());
      
    for(Person person : petPeople.keySet()) {
        System.out.println(person + " has:");
        
      for(Pet pet : petPeople.get(person))
          System.out.println("    " + pet);
    }
    }
    } /* Output:    
    People: [Person Luke, Person Marilyn, Person Isaac, Person Dawn, Person Kate]
    Pets: [[Rat Fuzzy, Rat Fizzy], [Pug Louie aka Louis Snorkelstein Dupree, Cat Stanford aka Stinky el Negro, Cat Pinkola], [Rat Freckly], [Cymric Molly, Mutt Spot], [Cat Shackleton, Cat Elsie May, Dog Margrett]]
    Person Luke has:
    Rat Fuzzy
    Rat Fizzy
    Person Marilyn has:
    Pug Louie aka Louis Snorkelstein Dupree
    Cat Stanford aka Stinky el Negro
    Cat Pinkola
    Person Isaac has:
    Rat Freckly
    Person Dawn has:
    Cymric Molly
    Mutt Spot
    Person Kate has:
    Cat Shackleton
    Cat Elsie May
    Dog Margrett
    *///:~
    

    Map可以返回它的键Set,它的值Collection,或者它的键值对的Set。keySet()方法产生了由在petPeople中的所有键组成的Set,它在foreach语句中被用来迭代遍历该Map.

    特别需要说明的一个地方,Map内部提供了一个Entry<K,V>接口,它提供了 V getValue()和 K getKey()方法,可以直接获得Map的键和值。然后Map也提供了Set<Map.Entry<K, V>> entrySet()方法来获得Entry接口。我们可以看下面这个例子,可以直接迭代获得Map的键和值。

    import java.util.*;
    
    public class EnvironmentVariables {
    public static void main(String[] args) {
      
    for(Map.Entry<String,String> entry: System.getenv().entrySet()) {
      System.out.println(entry.getKey() + ": " +
        entry.getValue());
    } 
    }
    }  
    

    相关文章

      网友评论

          本文标题:Map(学习java编程思想)

          本文链接:https://www.haomeiwen.com/subject/pvyruttx.html