【问题标题】:java update hashmapjava更新hashmap
【发布时间】:2012-11-16 01:21:05
【问题描述】:

我在更改 HashMap 中的值时遇到问题>。首先我这样做:

HashMap<String, ArrayList<Integer>> countries = new HashMap<>();
ArrayList<Integer> medals = new ArrayList<>();
medals.add(0); medals.add(0); medals.add(0);
for(int i = 0; i < COUNTRY.length; i++){
    countries.put(COUNTRY[i], medals);
}

我用静态数组中的键填充 HashMap,并添加一个用 0、0、0 填充的 ArrayList 的默认值。然后我这样做:

Integer plus = new Integer(1);
for(int j = 0; j < athletes.size(); j++){
    if(j == 3)
        break;
    Athlete a = athletes.get(j);
    ArrayList<Integer> medals = countries.get(a.getCountry());
    Integer medal = medals.get(j) + plus;
    medals.set(j, medal);
    countries.put(a.getCountry(), medals);
}

我有一个 ArrayList,其中包含已按运动员结果排序的运动员。我要做的是获取排名前 3 的运动员,并更新我的 HashMap 值,这样 ArrayList 将有 3 个数字,代表每个国家赢得了多少金、银和铜牌。 问题是,当我尝试用新的 ArrayList 替换旧值时,它会用新的 ArrayList 替换 HashMap 中的所有值,而不仅仅是具有匹配键的值。

我不知道问题是什么,有什么建议吗??

【问题讨论】:

    标签: java hashmap key


    【解决方案1】:

    问题出在这段代码中:

    HashMap<String, ArrayList<Integer>> countries = new HashMap<>();
    ArrayList<Integer> medals = new ArrayList<>();
    medals.add(0); medals.add(0); medals.add(0);
    for(int i = 0; i < COUNTRY.length; i++){
        countries.put(COUNTRY[i], medals);
    }
    

    您只需创建列表的一个实例,并将其与每个国家/地区相关联。

    一个可能的解决方法是在每次循环迭代中初始化一个新列表。

    HashMap<String, List<Integer>> countries = new HashMap<>();
    for(int i = 0; i < COUNTRY.length; i++){
        List<Integer> medals = Arrays.asList(0, 0, 0);
        countries.put(COUNTRY[i], medals);
    }
    

    如果您的 List 的固定大小为 3,为什么不使用简单的 int[] 来代替?

    这是使用 int[] 时代码的外观

    Map<String, int[]> countries = new HashMap<>();
    for(int i = 0; i < COUNTRY.length; i++){
        countries.put(COUNTRY[i], new int[3]);
    }
    //
    for(int j = 0; j < athletes.size(); j++){
        if(j == 3)
            break;
        Athlete a = athletes.get(j);
        int[] medals = countries.get(a.getCountry());
        medals[j]++;
        // last to lines could even be
        // countries.get(a.getCountry())[j]++;
    }
    

    【讨论】:

    • 谢谢,我早该知道我犯了一个愚蠢的错误:P,是的,我猜 int[] 更简单:)
    • 我为这个问题苦苦挣扎了很久,这是一个简单的解决方法。非常感谢!
    【解决方案2】:

    您应该使用 google-guava 的 MultiMap 。它正是针对这种需要Map&lt;K,List&lt;V&gt;&gt; 类型结构的情况而设计的。即同一键的多个值。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2012-01-10
      • 2012-01-01
      • 1970-01-01
      • 2016-09-12
      • 2011-04-23
      • 1970-01-01
      • 2020-09-20
      • 2023-04-01
      相关资源
      最近更新 更多