从哈希图中添加特定值,并将用户定义的对象作为值



我有一个哈希图,其形式为<gameID, Achievement>,其中成就是用户定义的对象,其中包含AchievementID,AchievementName和AchievementPoints:

[1003901=(901, Shoot 'em up, 100), 1001902=(902, Tango down, 15)]

我想根据整个游戏的成就点数将值相加,因此在本例中,我将 100 和 15 相加。我尝试使用 for each 循环进行循环访问,但是,我似乎无法弄清楚如何专门访问成就点成员并仅使用该值。有没有办法只遍历哈希图并根据对象值的特定成员添加值?

编辑 1:
抱歉,澄清一下,我的游戏 ID 实际上是一个组合,其中前四个数字是实际的游戏 ID,接下来的 3 个是成就 ID。这样做是为了保持 id 的唯一性。这就是为什么我要添加这两个

假设Java 8,如果你只是想把map中的所有值相加,你可以做这样的事情:

achievementMap.values().stream().mapToInt(a -> a.getAchievmentPoints()).sum();

这将创建一个流,该流循环访问映射中的所有值,将Achievement实例转换为整数值,选择对象的 achievementPoints 属性,然后将其全部汇总。

我猜这或多或少是你的意图:你有多个游戏,每个游戏都有多个成就:一个Map<Integer,List<Achievement>

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main
{
    static class Achievement
    {
        private int id;
        private String name;
        private int score;
        public Achievement( int id, String name, int score )
        {
            this.id = id;
            this.name = name;
            this.score = score;
        }
    }
    public static void main( String[] args )
    {
        Map<Integer, List<Achievement>> map = new HashMap<>();
        map.put( 1003, Arrays.asList( new Achievement( 901, "Shoot 'em up", 100 ) ) );
        map.put( 1001, Arrays.asList( new Achievement( 902, "Tango down", 15 ) ) );
        System.out.println( map.get( 1003 ).stream().mapToInt( ( a ) -> a.score ).sum() );
    }
}

如果你想做的是通过游戏收集的所有积分相加,假设你在Achievement类中使用encapsulation并且有一个getter成就点的方法,那么如果你像这样迭代hashMap会怎样:

int sum = 0;
 Iterator it = gameMap.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        sum += pair.getValue().getAchievementPoints();
    }
System.out.println("Sum = " + sum);
 int total = 0;
HashMap<String,Achievement> map = new HashMap();
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()){
  Map.Entry entry = (Map.Entry) iterator.next();
  Achievement achievement = (Achievement) entry.getValue();
  //Once you have achievement Object, apply your custom logic here.
  total = total + achievement.achievementPoints;
}

最新更新