使用用户定义的对象作为值从散列映射添加特定值

时间:2016-01-31 18:43:08

标签: java hashmap

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

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

我想在整个游戏中添加基于AchievementPoints的值,所以在这种情况下,我会加上100和15.我试图使用for循环来迭代,但是,我可以&#39;似乎弄清楚如何专门访问AchievementPoints成员,并只使用该值。有没有办法只是遍历hashmap,只是根据对象值的特定成员添加值?

编辑1:
对不起,为了澄清,我的gameID实际上是一个组合,其中前四个数字是实际的游戏ID,接下来的三个是achievementID。这样做是为了保持id的独特性。这就是为什么我要添加这两个

4 个答案:

答案 0 :(得分:2)

假设使用Java 8,如果您只想在地图中添加所有值,则可以执行以下操作:

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

这会创建一个迭代地图中所有值的流,执行Achievement实例到整数值的转换,选择对象的achievementPoints属性然后将其全部加起来

答案 1 :(得分:1)

我猜这或多或少是你想要的:你有多个游戏,每个游戏都有多个成就: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() );
    }
}

答案 2 :(得分:0)

如果您要做的是将通过游戏收集的所有积分相加,假设您在encapsulation课程中使用Achievement并且有成就点的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);

答案 3 :(得分:0)

 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;

}