如何通过几个HashMaps执行算术运算?

时间:2016-11-30 20:17:48

标签: java android collections

目前我有6个HashMaps,其中包含城市名称和不同类别的值,但我需要为每个类别总结每个城市的值,即:

HashMap<String, Integer> HeatHMap = new HashMap<>();
HashMap<String, Integer> DaylightHMap = new HashMap<>();
HashMap<String, Integer> PrecitipationHMap = new HashMap<>();
HashMap<String, Integer> DaylightHMap = new HashMap<>();
HashMap<String, Integer> WindHMap = new HashMap<>();
HashMap<String, Integer> MoistureHMap = new HashMap<>();

HeatHMap包含:

Cities    Values
Tucson     23
Hermosillo 47
Boulder    25

和DaylightHMap包含:

Cities    Values
Tucson     43
Hermosillo 37
Boulder    75

现在,我需要为每个类别添加每个城市的值,即Hermosillo,并将值保存到另一个HashMap中,结果如下:

 Cities    Values
 Tucson      78 =  (23+43+...+n)
 Hermosillo  160 = (47+37+...+n)
 ....

我正在考虑将每个HashMap添加到ArrayList中,然后访问每个城市,但我意识到将HashMap放入列表中并不是解决此问题的好方法。到目前为止,我有:

public void verifyTheWinner(
HashMap <String, Integer> Table1, HashMap <String, Integer> Table2, 
HashMap <String, Integer> Table3, HashMap <String, Integer> Table4, 
HashMap <String, Integer> Table5, HashMap <String, Integer> Table6)
  {
    List<HashMap> categories = new ArrayList<HashMap>();

    categories.add(Weather);
    categories.add(SeaWeather);
    categories.add(Rainfall);
    categories.add(Sunshine);
    categories.add(Prices);
    categories.add(AvgStd);


    HashMap<String, Integer> citiesAndValuesTotal= new HashMap<>();

    for (int i=0; i<categories.size(); i++){
       ......
    }}

我的问题是:

  1. 如何执行算术运算,例如为每个城市添加值,然后将它们保存到新的HashMap中?

  2. 我可以用另一个Collection来实现这个目标,还是HashMap是解决这个问题的最佳方法?

  3. 感谢您的支持,如果您需要,请向我询问更多详情。每个答案都欢迎。

3 个答案:

答案 0 :(得分:2)

您可以使用更好的数据结构,例如包含任何特定城市所需详细信息的类:

public class CityWeather {
    private String name;
    private int heat;
    private int daylight;
    // ...
    private int moisture;
    // ...
}

然后你只需要一个地图,比如说

HashMap<String, CityWeather> weatherMap = new HashMap<>();

一张地图可以满足当前所有其他地图的需求,包括您要创建的citiesAndValuesTotal地图。最后,您需要做的就是向CityWeather添加一个方法,如下所示:

int meaninglessWeatherSum() {
    return heat + daylight + ... + moisture;
}

然后你不需要做任何特别的事情来执行计算 - 它就在你想要的时候就可以了。

答案 1 :(得分:1)

我会创建一个自定义对象(可能称为City)来处理这样的事情。

public class City {

  public String name;
  public Integer heat;
  public Integer dayLight;
  public Integer precipitation;
  public Integer wind;
  public Integer moisture;

  public Integer getTotal() {
    return heat + dayLight + precipitation + wind + moisture;
  }

}

您可以拥有一个地图,从城市名称到City对象。

此外,我认为你拼错了“降水”,有两个“日光”地图,你的参数名称与你在verifyTheWinner方法中使用的名称不匹配。

答案 2 :(得分:0)

我非常感谢你的解决方案John Bollinger和Adam Rosni,但我能够通过使用这篇文章的解决方案解决这个问题 how to merge more than one hashmaps also sum the values of same key in java更适合我的需求。

我的解决方案如下:

//Solution from Melike Ttkn from the mentioned link

public HashMap<String, Integer> mergeAndAdd(ArrayList<HashMap<String, Integer>> maplist) {
    HashMap<String, Integer> result = new HashMap<>();
    for (HashMap<String, Integer> map : maplist) {
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer current = result.get(key);
            result.put(key, current == null ? entry.getValue() : entry.getValue() + current);
        }
    }
    return result;
}

然后我添加了我的方法来制作一个像这样的HashMaps的listArray:

public ArrayList<HashMap<String,Integer>> makeAlist(HashMap<String,Integer> Values1, HashMap<String, Integer> Values2, HashMap<String, Integer> Values3,
HashMap<String, Integer> Values4, HashMap <String, Integer> Values5, HashMap<String, Integer> Values6){

ArrayList<HashMap<String,Integer>> mergedCategories = new ArrayList<>();

    mergedCategories.add(Values1);
    mergedCategories.add(Values2);
    mergedCategories.add(Values3);
    mergedCategories.add(Values4);
    mergedCategories.add(Values5);
    mergedCategories.add(Values6);

    return mergedCategories;
}

最后,我刚刚调用了这个方法:

System.out.println(mergeAndAdd(makeAlist(Values1, Values2, Values3, Values4, Values5, Values6)));