【问题标题】:How to perform arithmetic operations through several HashMaps?如何通过几个HashMap进行算术运算?
【发布时间】:2017-04-15 07:25:27
【问题描述】:

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

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 是解决这个问题的最佳方法?

感谢您的支持,如果您需要更多详细信息,请向我询问。欢迎每个答案。

【问题讨论】:

  • 所以您打算将温度添加到每个城市的风速等日光小时数?这有什么意义?
  • 嘿@JohnBollinger!好吧,我要添加的值仅用于测试目的,因为更多的表包含必须添加的更有意义的数据。这些仅用于测试目的。

标签: java android collections


【解决方案1】:

使用更好的数据结构会更好,例如包含任何给定城市所需的所有详细信息的类:

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
【解决方案2】:

我会创建一个自定义对象(可能称为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 方法中使用的名称不匹配。

【讨论】:

    【解决方案3】:

    非常感谢您的解决方案 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;
    }
    

    然后我添加了我的方法来制作一个这样的 HashMap 列表数组:

    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)));
    

    【讨论】:

      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 2014-01-22
      • 1970-01-01
      相关资源
      最近更新 更多