2012-11-18 83 views
10

我需要創建一個靜態Map,它將給定的String映射到int的陣列。如何創建字符串的靜態映射 - >陣列

換句話說,我想定義是這樣的:

"fred" -> {1,2,5,8} 
"dave" -> {5,6,8,10,11} 
"bart" -> {7,22,10010} 
... etc 

有沒有一種簡單的方法在Java中做到這一點?

如果可能的話,我想使用和int值爲static常量。

編輯:爲了澄清我的意思通過static常數的值,並給予我所看到的是正確的代碼,這裏是我的解決方案首次嘗試:

public final static String FRED_TEXT = "fred"; 
public final static String DAVE_TEXT = "dave"; 

public final static int ONE = 1; 
public final static int TWO = 2; 
public final static int THREE = 3; 
public final static int FOUR = 4; 

public final static HashMap<String, int[]> myMap = new HashMap<String, int[]>(); 
static { 
    myMap.put(FRED_TEXT, new int[] {ONE, TWO, FOUR}); 
    myMap.put(DAVE_TEXT, new int[] {TWO, THREE}); 
} 

注,這些名字不是我實際使用的。這只是一個人爲的例子。

回答

21

不需要需要單獨聲明和初始化。如果你知道如何,它可以在一行中完成!

// assumes your code declaring the constants ONE, FRED_TEXT etc is before this line 
private static final Map<String, int[]> myMap = Collections.unmodifiableMap(
    new HashMap<String, int[]>() {{ 
     put(FRED_TEXT, new int[] {ONE, TWO, FOUR}); 
     put(DAVE_TEXT, new int[] {TWO, THREE}); 
    }}); 

我們在這裏是一個匿名類的inialization block - 這個構造後建設執行的代碼塊,這是我們在這裏用來加載地圖(這有時被錯誤地稱爲「雙支柱初始化「 - 我想因爲有兩個相鄰的大括號=但實際上沒有這種東西)。

這兩件很酷的事情是:a)它將聲明與內容結合在一起,b)因爲初始化是在線的,所以你也可以在線調用Collections.unmodifiableMap(),從而產生一個整齊的單行聲明,初始化和轉換爲不可修改。

如果你並不需要/希望地圖是不可修改的,省去了電話:

private static final Map<String, int[]> myMap = new HashMap<String, int[]>() {{ 
    put(FRED_TEXT, new int[] {ONE, TWO, FOUR}); 
    put(DAVE_TEXT, new int[] {TWO, THREE}); 
}}; 
+0

啊,但我需要在一個超類中聲明Map,但是將它填充到一個子類中。對不起,我知道這不是我原來的問題。在這種情況下,我仍然需要'static'塊? – DuncanKinnear

+0

但是,由於這是'static',它怎麼可能是「構造函數之後在構造上執行的代碼塊」?當你參考'static'代碼時,我認爲構造不會發生。 – DuncanKinnear

+1

@DuncanKinnear實例是靜態的,但塊不是。該塊是靜態實例化的匿名類的實例塊。匿名類是'HashMap'的子類,其中只有一個實例存在('new'只被調用一次) – Bohemian

1
static Map<String, int[]> map = new HashMap<>(); 

的地圖是靜態的,您可以訪問它,而無需創建它在定義的類的實例。我不知道你的意思是與具有鍵有什麼和值靜爲好,因爲它是沒有意義對我來說。

+0

請參閱我的編輯使用靜態常量的示例。 – DuncanKinnear

5

您需要分別聲明和初始化您的靜態映射。

以下是聲明部分:

private static final Map<String,int[]> MyMap; 

這裏是初始化塊:

static { 
    Map<String,int[]> tmpMap = new HashMap<String,int[]>(); 
    tmpMap.put("fred", new int[] {1,2,5,8}); 
    tmpMap.put("dave", new int[] {5,6,8,10,11}); 
    tmpMap.put("bart", new int[] {7,22,10010}); 
    MyMap = Collections.unmodifiableMap(tmpMap); 
} 

不幸的是,數組始終用Java寫的。您將無法指定MyMap,但您可以添加或刪除訪問地圖的程序其他部分的值。

+1

+1用於靜態初始化塊 – jlordo

+1

當然,在這個例子中,map和數組都是可寫的。 – cdhowie

+0

@cdhowie你說得對,我在答案中加了一段來強調這一點。 – dasblinkenlight

0
public class ExampleClass { 
    public final static HashMap consts = new HashMap(); 
    static 
    { 
     constants.put("A", "The Letter A"); 
     constants.put("B", "The Letter B"); 
     constants.put("C", "The Letter C"); 
    } 
    /* Rest of your class that needs to know the consts */ 
} 
+0

糾正我,如果我錯了,但靜態塊在「consts」初始化權之前執行? –

+0

我已經測試過,無論你寫的是否正確。但是如果我們切換const int intitialization塊和靜態塊,它會拋出編譯錯誤。我從來沒有想過定義元素的順序會對Java產生任何影響。 –

5

爲了完整起見,因爲這是第一次結果在谷歌的「Java靜態定義映射'在Java 8中,您現在可以執行此操作。

Collections.unmodifiableMap(Stream.of(
      new SimpleEntry<>("a", new int[]{1,2,3}), 
      new SimpleEntry<>("b", new int[]{1,2,3}), 
      new SimpleEntry<>("c", new int[]{1,2,3})) 
      .collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()))); 

這個漂亮的部分與這是我們不與雙括號語法({{ }}

然後,我們可以用一些代碼擴展這個清理喜歡這個傢伙的模式建立匿名類了在這裏做 http://minborgsjavapot.blogspot.ca/2014/12/java-8-initializing-maps-in-smartest-way.html

public static <K, V> Map.Entry<K, V> entry(K key, V value) { 
    return new AbstractMap.SimpleEntry<>(key, value); 
} 

public static <K, U> Collector<Map.Entry<K, U>, ?, Map<K, U>> entriesToMap() { 
    return Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()); 
} 

public static <K, U> Collector<Map.Entry<K, U>, ?, ConcurrentMap<K, U>> entriesToConcurrentMap() { 
    return Collectors.toConcurrentMap((e) -> e.getKey(), (e) -> e.getValue()); 
} 

最終結果

Collections.unmodifiableMap(Stream.of(
      entry("a", new int[]{1,2,3}), 
      entry("b", new int[]{1,2,3}), 
      entry("c", new int[]{1,2,3})) 
      .collect(entriesToMap())); 

這將給我們一個併發的不可修改的地圖。

+0

感謝您的回答。恥辱,我們被困在Java 6上。 – DuncanKinnear

相關問題