2014-12-07 105 views
-3

我一直在阅读布鲁斯Eckel的“在Java编程思想”,我不明白这样做的代码做:这段代码做了什么?

static Map<String,String> select(final int size) { 
    return new FlyweightMap() { 
     public Set<Map.Entry<String,String>> entrySet() { 
     return new EntrySet(size); 
     } 
    }; 
    } 

PROGRAMM的完整清单:

package net.mindview.util; 
import java.util.*; 
import static net.mindview.util.Print.*; 

public class Countries { 
    public static final String[][] DATA = { 
    // this is a big array "Country-Capital" 
    {"ALGERIA","Algiers"}, {"ANGOLA","Luanda"}, 
    {"URUGUAY","Montevideo"}, {"VENEZUELA","Caracas"}, 
    // ... 
    }; 
    // Use AbstractMap by implementing entrySet() 
    private static class FlyweightMap 
    extends AbstractMap<String,String> { 
    private static class Entry 
    implements Map.Entry<String,String> { 
     int index; 
     Entry(int index) { this.index = index; } 
     public boolean equals(Object o) { 
     return DATA[index][0].equals(o); 
     } 
     public String getKey() { return DATA[index][0]; } 
     public String getValue() { return DATA[index][1]; } 
     public String setValue(String value) { 
     throw new UnsupportedOperationException(); 
     } 
     public int hashCode() { 
     return DATA[index][0].hashCode(); 
     } 
    } 
    // Use AbstractSet by implementing size() & iterator() 
    static class EntrySet 
    extends AbstractSet<Map.Entry<String,String>> { 
     private int size; 
     EntrySet(int size) { 
     if(size < 0) 
      this.size = 0; 
     // Can't be any bigger than the array: 
     else if(size > DATA.length) 
      this.size = DATA.length; 
     else 
      this.size = size; 
     } 
     public int size() { return size; } 
     private class Iter 
     implements Iterator<Map.Entry<String,String>> { 
     // Only one Entry object per Iterator: 
     private Entry entry = new Entry(-1); 
     public boolean hasNext() { 
      return entry.index < size - 1; 
     } 
     public Map.Entry<String,String> next() { 
      entry.index++; 
      return entry; 
     } 
     public void remove() { 
      throw new UnsupportedOperationException(); 
     } 
     } 
     public 
     Iterator<Map.Entry<String,String>> iterator() { 
     return new Iter(); 
     } 
    } 
    private static Set<Map.Entry<String,String>> entries = 
     new EntrySet(DATA.length); 
    public Set<Map.Entry<String,String>> entrySet() { 
     return entries; 
    } 
    } 
    // Create a partial map of 'size' countries: 
    static Map<String,String> select(final int size) { 
    return new FlyweightMap() { 
     public Set<Map.Entry<String,String>> entrySet() { 
     return new EntrySet(size); 
     } 
    }; 
    } 
    static Map<String,String> map = new FlyweightMap(); 
    public static Map<String,String> capitals() { 
    return map; // The entire map 
    } 
    public static Map<String,String> capitals(int size) { 
    return select(size); // A partial map 
    } 
    static List<String> names = 
    new ArrayList<String>(map.keySet()); 
    // All the names: 
    public static List<String> names() { return names; } 
    // A partial list: 
    public static List<String> names(int size) { 
    return new ArrayList<String>(select(size).keySet()); 
    } 
    public static void main(String[] args) { 
    print(capitals(10)); 
    print(names(10)); 
    print(new HashMap<String,String>(capitals(3))); 
    print(new LinkedHashMap<String,String>(capitals(3))); 
    print(new TreeMap<String,String>(capitals(3))); 
    print(new Hashtable<String,String>(capitals(3))); 
    print(new HashSet<String>(names(6))); 
    print(new LinkedHashSet<String>(names(6))); 
    print(new TreeSet<String>(names(6))); 
    print(new ArrayList<String>(names(6))); 
    print(new LinkedList<String>(names(6))); 
    print(capitals().get("BRAZIL")); 
    } 
} /* Output: 
{ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo, BOTSWANA=Gaberone, BULGARIA=Sofia, BURKINA FASO=Ouagadougou, BURUNDI=Bujumbura, CAMEROON=Yaounde, CAPE VERDE=Praia, CENTRAL AFRICAN REPUBLIC=Bangui} 
[ALGERIA, ANGOLA, BENIN, BOTSWANA, BULGARIA, BURKINA FASO, BURUNDI, CAMEROON, CAPE VERDE, CENTRAL AFRICAN REPUBLIC] 
{BENIN=Porto-Novo, ANGOLA=Luanda, ALGERIA=Algiers} 
{ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo} 
{ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo} 
{ALGERIA=Algiers, ANGOLA=Luanda, BENIN=Porto-Novo} 
[BULGARIA, BURKINA FASO, BOTSWANA, BENIN, ANGOLA, ALGERIA] 
[ALGERIA, ANGOLA, BENIN, BOTSWANA, BULGARIA, BURKINA FASO] 
[ALGERIA, ANGOLA, BENIN, BOTSWANA, BULGARIA, BURKINA FASO] 
[ALGERIA, ANGOLA, BENIN, BOTSWANA, BULGARIA, BURKINA FASO] 
[ALGERIA, ANGOLA, BENIN, BOTSWANA, BULGARIA, BURKINA FASO] 
Brasilia 
*///:~ 
+0

这不是一个寻求调试帮助的问题,而是要求识别不熟悉的结构。 – 2014-12-07 16:07:10

+0

而不是此程序,如果您最初查看CountingMapData程序(在此程序之后它的三或四页),将很容易。 AbstractSet的使用使得这个程序对新手来说很复杂。它可以使用LinkedHashSet或任何其他Set来代替AbstractSet。看看这一点,然后很容易理解.... – maamaa 2015-03-29 06:18:01

回答