java更新hashmap

zkr*_*anc 1 java key hashmap

我在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);
}
Run Code Online (Sandbox Code Playgroud)

我用静态数组中的键填充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);
}
Run Code Online (Sandbox Code Playgroud)

我有一个填充了运动员的ArrayList,已根据运动员的结果排序.我想要做的就是选择前三名运动员,并更新我的HashMap值,这样ArrayList将有3个数字代表每个国家赢得的金牌,银牌和铜牌数量.问题是,当我尝试用新的ArrayList替换旧值时,它会用新的ArrayList替换HashMap中的所有值,而不是仅使用匹配键的值.

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

jlo*_*rdo 7

问题在于这段代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

您只需创建List的单个实例,并将其与每个国家/地区相关联.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您的列表的固定大小为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]++;
}
Run Code Online (Sandbox Code Playgroud)