【问题标题】:Use Hashmap to Find Per Capita Data使用 Hashmap 查找人均数据
【发布时间】:2020-04-01 15:48:24
【问题描述】:

我想知道克利夫兰一个邮政编码的人均犯罪率。

每次犯罪发生时,它都会以如下方式登录到我的哈希图中:

crimePopulationMap.put(zipCode, zipCodePopulation);

如何计算所有邮政编码的所有实例并将其与人均犯罪率一起打印出来?因此,我必须将邮政编码出现的所有时间加起来,然后将其除以人口,并将值存储为人口。请帮忙,因为我以前没有使用过哈希映射。我也想将通用哈希映射传递给此方法以获取这些计算。

打印到控制台的示例是:

95103 0.0284
95123 0.0288
93143 0.0290

【问题讨论】:

标签: java hashmap


【解决方案1】:

您需要 两张 地图。一个用于跟踪每个邮政编码的人口,另一个用于跟踪每个邮政编码的当前犯罪计数。

Map< PostalCode , Integer >  // Map of each postal code to a population number.

……和……

Map< PostalCode , Integer >  // Map of each postal code to a count of crimes. 

在每个犯罪报告中,增加第二张地图中的整数。

要构建人均犯罪报告,请调用方法从每个地图中获取一组键,并将它们组合起来,以防两个地图不共享相同的键。然后循环该不同的邮政区值列表。对于每个区域,查找人口并查找犯罪计数。然后分。

【讨论】:

    【解决方案2】:

    阅读问题后,我了解到输入是带有相关邮政编码的单一犯罪事件流。除此之外,您还拥有每个邮政编码的人口数量。您需要有两个哈希映射来保存这些数据。

    1. 邮政编码和受人尊敬的人口数量地图。这可以是问题中指定的地图。

    2. 邮政编码和累积犯罪事件的单独地图。该地图被定义为Map&lt;String, Integer&gt;(假设邮编为String),其中key 是邮政编码,value 是一个计数器,每当程序收到新的犯罪事件通知时,该计数器就会递增。 merge() 方法可用于初始化新条目和增加后续调用:crimeCountMap.merge(zipCode, 1, (counter, one) -&gt; counter + one);

    3. 随时生成所有邮政编码的人均犯罪率列表,遍历crimeCountMap的key,从crimePopulationMap获取相同key的值并进行除法运算

    【讨论】:

      【解决方案3】:

      以下是一个示例,说明如何获得此统计信息:

      // you need to preload this
      Map<String,Integer> populationMap = new HashMap<>();
      populationMap.put("95103", 100);
      populationMap.put("95123", 200);
      populationMap.put("93143", 300);
      
      Map<String,Integer> crimeMap = new HashMap<>();
      // update the counter with every event
      crimeMap.merge("95103", 1, Integer::sum);
      // update the counter with every event
      crimeMap.merge("95103", 1, Integer::sum);
      // update the counter with every event
      crimeMap.merge("95123", 1, Integer::sum);
      
      // to get the final stats
      Map<String, Float> collect = populationMap.entrySet().stream()
              .map(populationMapEntry -> {
                  String zipCode = populationMapEntry.getKey();
                  Integer populationInZipCode = populationMapEntry.getValue();
                  Integer crimeInZipCode = crimeMap.getOrDefault(zipCode, 0);
                  Float rate = crimeInZipCode.floatValue() / populationInZipCode.floatValue();
                  return new AbstractMap.SimpleEntry<String, Float>(zipCode, rate);
              })
              .collect(Collectors.toMap(
                      entry -> entry.getKey(),
                      entry -> entry.getValue()));
      System.out.println(collect);
      // {95123=0.005, 95103=0.02, 93143=0.0}
      

      为了更具表现力,我使用了更多的变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-01
        • 2018-03-03
        • 2021-12-22
        • 2018-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        相关资源
        最近更新 更多