在Java中遍历HashMap

3

我正在尝试使用Processing和geoJSON创建Cholorpleth地图。我在循环遍历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);   
}

我想要做的是遍历我的 HashMap countyData 并获取每个条目的人口。使用 if 语句将其与某个值进行比较,然后根据为真的语句分配颜色。
我的 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);

一直输出哈希表的最后一个条目。

这是我得到的输出结果。

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 的键是什么? - C.B.
这可能听起来很蠢,但我不认为我指定了键,我只是使用了putAll()方法将数据添加到其中,当我打印它时,那就是控制台窗口中的输出! - Javacadabra
我认为 namepop 可能是键。 - Javacadabra
对于一个写得好的问题,点赞。 - Paul Bellora
3个回答

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 方法会覆盖相同键的条目:

将指定映射中的所有映射复制到此映射中(可选操作)。调用此方法的效果等同于在此映射上为指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v)。


我已经添加了一个方法,用于填充我的 HashMap - Javacadabra
你已经正确地填充了你的映射表。请看我的 PS。而且你不应该在 get() 方法中使用硬编码的值。 - Svetlin Zarev
我实现了你的解决方案,并编辑了我的帖子展示新的输出。出于某种原因,它仍然专注于地图的最后一个元素。 - Javacadabra
刚刚注意到那里!!!那一定是正在发生的事情。 - Javacadabra
我的互联网连接断了一会儿 :) 现在应该已经更新了。 - Svetlin Zarev
显示剩余2条评论

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

这里我使用了entrySet()方法,它返回此映射中所包含映射的Set视图,通过这些映射,你可以使用getKey()和getValue()方法获取键和值。


@Javacadabra 你试过了吗,我的朋友。 - Girish

0

问题是:

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

你硬编码了获取“pop”的关键字

你可能想要:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接