2013-09-25 65 views
1

我嘗試刷新我的Java技能。但是現在我堅持一個hashmap。我沒有得到正確的對象。這是我的示例代碼:Java:通過鍵從一個Hashmap獲取對象

public class Sample { 

    private static Map<String, Map<String, String>> peaks = new HashMap<String, Map<String, String>>(); 
    private final String name; 

    public Sample(String name) { 
     this.name = name; 
     this.peaks = new HashMap<String, Map<String, String>>(); 
    } 

    public static Map<String, Map<String, String>> getPeaks() { 
     return peaks;} 

    public static void addPeak(String peakName, String value) { 
     Map<String, String> peak = new HashMap<String, String>(); 
     peak.put("value", value); 
     peaks.put(peakName, peak); 
    } 
} 

public class Main { 
    static Map<Integer, Sample> sample = new HashMap<Integer, Sample>(); 

    public static void main(String[] args) { 
     Sample sam = new Sample("Test1"); 
     sample.put(1, sam); 
     sample.get(1).addPeak("A", "1"); 

     sam = new Sample("Test2"); 
     sample.put(2, sam); 
     sample.get(2).addPeak("B", "123"); 

     System.out.println(sample.get(1).getPeaks().toString());  
     System.out.println(sample.get(2).getPeaks().toString());  
     System.out.println(sample.get(4).getPeaks().toString());  
    } 
} 

每次輸出爲:{B = {值= 123}}

不知哪一部分是錯誤的。我錯過了什麼?

+0

你會得到什麼?請粘貼您的輸出。 – Freak

+0

只需刪除靜態。 – ujvl

+0

@freak它在那裏,埋葬。 Joko,請將輸出作爲一個單獨的塊發佈,而不是將其隱藏在評論中。 – chrylis

回答

1

這張地圖是靜態的:

private static Map<String, Map<String, String>> peaks = new HashMap<String, Map<String, String>>(); 

因此,每次調用Sample.getPeaks()指向同一個地圖。

//getPeaks() returns the same map in both cases. 
// In other words : sample.get(1).getPeaks() == sample.get(2).getPeaks() 
System.out.println(sample.get(1).getPeaks().toString());  
System.out.println(sample.get(2).getPeaks().toString()); 

// This is equivalent to 
Map<String, Map<String, String>> myStaticMap = Sample.getPeaks(); 
System.out.println(myStaticMap.toString());  
System.out.println(myStaticMap.toString()); 
1

的方法getPeaksaddPeaks以及地圖peaks是靜態的!這意味着它們只存在一次(每個類),而不是每個Sample的實例一次。

因此,每次創建一個新的Sample實例時,都會覆蓋構造函數中的靜態字段peaks!刪除static關鍵字!

0

也許你正試圖學習如何使用嵌套地圖,但對於這種實現,你不能簡單地創建一個Map<String, String>?我問的原因是因爲在addPeak中,您撥打了peak.put("value", value),硬編碼字符串「value」,這可能是不必要的。下面是一些代碼,可滿足你感興趣的:

public class WhyMapOfMap { 

    // Simpler map 
    private Map<String, String> peaks; 
    private String name; 

    public WhyMapOfMap(String name) { 
     this.name = name; 
     peaks = new HashMap<>(); 
    } 

    public Map<String, String> getPeaks() { 
     return peaks; 
    } 

    public void addPeak(String peakName, String value) { 
     peaks.put(peakName, value); 
    } 
} 

然後,你可以正常訪問sample.get(key).getPeaks()地圖。

+0

謝謝你的回答!也許有一個更簡單的方法來做到這一點。但是在我完整的源代碼中,我保存的不僅僅是'值'。 – Joko

+0

啊我明白了。我有時會發現很難將我需要的數據建模到標準集合中。在這些情況下,我會傾向於使用對象組合的方法。我期待的指導原則是「智能數據和愚蠢算法」。祝你好運! – Meesh