2014-02-06 61 views
3

我正在嘗試使用Processing和geoJSON創建Cholorpleth地圖。我無法通過我的HashMap循環檢查將決定多邊形顏色強度的屬性。在Java中使用HashMap進行迭代

目前,這是我的代碼:

void draw() { 
    map.draw(); 
    for (int i = 0; i < countyMarkers.size(); i++) { 
    Marker county = countyMarkers.get(i); 
    String pop = countyData.get("pop").toString(); 
    println(i + "pop: " + pop); 
} 

我想這樣做的是循環通過我HashMapcountyData,讓每個條目的人口。使用if語句將其與值進行比較,然後根據語句爲true將其分配給顏色。

我的HashMap可以在這裏看到:

{name=Carlow, pop=54,612} 
{name=Cavan, pop=73,183} 
{name=Clare, pop=117,196} 
{name=Cork, pop=519,032} 
{name=Donegal, pop=161,137} 
{name=Dublin, pop=1,273,069} 
{name=Galway, pop=250,541} 
{name=Kerry, pop=145,502} 
{name=Kildare, pop=210,312} 
{name=Kilkenny, pop=95,419} 
{name=Laois, pop=80,559} 
{name=Letrim, pop=31,796} 
{name=Limerick, pop=191,809} 
{name=Longford, pop=39,000} 
{name=Louth, pop=122,897} 
{name=Mayo, pop=130,638} 
{name=Meath, pop=184,135} 
{name=Monaghan, pop=60,483} 
{name=Offaly, pop=76,687} 
{name=Roscommon, pop=64,065} 
{name=Sligo, pop=65,393} 
{name=Tipperary, pop=158,754} 
{name=Waterford, pop=113,795} 
{name=Westmeath, pop=86,164} 
{name=Wexford, pop=145,320} 
{name=Wicklow, pop=136,640} 

我是比較新的這種類型的數據,所以我很茫然到哪裏,我錯了工作。我認爲我的邏輯是正確的我只是不知道如何實現它。 我很感謝在這個問題上的任何幫助。

目前這條線 - >println(i + "pop: " + pop);

輸出HashMap中的最後一個條目一遍又一遍。

這是我得到

0pop: 136,640 
1pop: 136,640 
2pop: 136,640 
3pop: 136,640 
4pop: 136,640 
5pop: 136,640 
6pop: 136,640 
7pop: 136,640 
8pop: 136,640 
9pop: 136,640 
10pop: 136,640 
11pop: 136,640 
12pop: 136,640 
13pop: 136,640 
14pop: 136,640 
15pop: 136,640 
16pop: 136,640 
17pop: 136,640 
18pop: 136,640 
19pop: 136,640 
20pop: 136,640 
21pop: 136,640 
22pop: 136,640 
23pop: 136,640 
24pop: 136,640 
25pop: 136,640 

輸出我用這個方法填充我HashMap

void getCountyDetails(List<Marker>m) { 
    countyData = new HashMap(); 
    for (Marker county: countyMarkers) { 
    countyData.putAll(county.getProperties()); 
    println(countyData); 
    } 
} 

修改後的代碼在這裏

Set<String> keySet = countyData.keySet(); 
    for(String pop : keySet){ 
    String value = countyData.get(pop).toString(); 
    println("population:" + value); 
    } 

現在是輸出:

population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 
population:Wicklow 
population:136,640 

它似乎仍然沒有通過的HashMap

新方式,每個條目迭代填充HashMap

void getCountyDetails(List<Marker>m) { 
    countyData = new HashMap(); 
    int i = 0; 
    for (Marker county: countyMarkers) { 
    countyData.put(i,county.getProperties()); 
    i++; 
    } 
} 
+1

「HashMap」的關鍵字是什麼? –

+0

這可能聽起來很愚蠢,但我不認爲我指定了鍵,我只是使用'putAll()'方法將數據添加到它,並且當我打印它時,它是控制檯窗口中的輸出! – Javacadabra

+0

我想也許'名稱'和'流行'鑰匙 – Javacadabra

回答

2

從你的代碼中,我們可以看到你正在使用countyData.get("pop")的 - 即你有硬編碼的key,所以它總是會返回一個與同樣的東西 - 與此key相關的value

PS:您可以通過使用按鍵遍歷圖中的所有元素形成keySet

Set<KeyClass> keySet = myMap.keySet(); 
for(KeyClass key : keySet){ 
    ValueClass value = myMap.get(key); 
    //do stuff 
} 

而且,你應該注意的是,putAll方法將覆蓋具有相同鍵條目:

將指定映射的所有映射覆制到此映射(可選操作)。這個調用的效果等同於在該映射上調用put(k,v)一次,用於在指定的映射中從關鍵字k到值v的每次映射

+0

我已經添加了我填充我的'HashMap'的方法。 – Javacadabra

+0

你正確地填充你的地圖。看我的'PS'。你不應該在'get()'方法中使用硬編碼的值 –

+0

我實現了你的解決方案,並且編輯了我的帖子,顯示了新的輸出。由於某種原因,它仍然關注地圖的最後一個元素。 – Javacadabra

0

的問題是:

String pop = countyData.get("pop").toString(); 

你硬編碼的關鍵是獲得 「流行」

你可能想:

String pop = countyData.get(county).toString(); 
1
for (Map.Entry<String, Integer> countyMarkers: map.entrySet()) 
    { 
     System.out.println(countyMarkers.getKey() + " " + countyMarkers.getValue()); 
    } 

在這裏,我已經使用的entrySet ()方法,它將返回此映射中包含的映射的Set視圖,然後通過^ h這些映射你可以使用信息getKey()和getValue key和value()方法

+0

@Javacadabra你試過了嗎,我的朋友 – Tenacious