抱歉,如果这是一个菜鸟问题,但我挠头如何在for循环内向以下映射添加值:

private void filterSnakes() {
    Map<Integer, Map<Integer, Integer>> mapSnakes
            = new HashMap<Integer, Map<Integer, Integer>>();

    int coutner = 0;

    for(int i = 0; i < mGameAssets.length; i++)
    {
        if(mGameAssets[i].getAssetType().isSnake()){ //check if the asset is snake
             mapSnakes.put(++coutner, i,mGameAssets[i].getDamage() );
        }
    }
}

我的意思是我该如何在mapSnakes一个新条目,关键部分还可以,但是Value部分本身就是Map呢?

===============>>#1 票数:2

您需要先创建或获取嵌套地图:

++counter;
if (!mapSnakes.containsKey(counter)) {
  mapSnakes.put(counter, new HashMap<Integer, Integer>());
}

mapSnakes.get(counter).put(i,mGameAssets[i].getDamage());

在上面的代码中,如果不存在嵌套映射,则创建嵌套映射。 接下来,使用mapSnakes.get(counter)获取地图,然后将内容添加到嵌套地图中。

===============>>#2 票数:2

您已将地图声明为从整数到地图的映射。 因此

    mapSnakes.put(++counter, i,mGameAssets[i].getDamage() );

需要是这样的:

    Map<Integer, Integer> submap = ...
    mapSnakes.put(++counter, submap);

...或者可能类似于@dimoniy的答案。 (尚不清楚,因为您实际上没有指定要如何初始化数据结构。我可以猜测,但是今天早上我不会玩这个游戏。)


其他要指出的是:

  • 这看起来像一个糟糕的OO设计。 Java中基本类型等的映射的映射具有“代码味道”。 通常,这意味着您应该定义一些应用程序类。

  • 映射在内存使用和时间方面都是相当昂贵的数据结构。 而且,每当必须使用Integer而不是int ,由于装箱和拆箱都会产生开销。

===============>>#3 票数:1 已采纳

您必须将其分为两个步骤:

  1. 创建要插入的地图。
  2. 将其插入mapSnakes

像这样:

if(mGameAssets[i].getAssetType().isSnake()){ //check if the asset is snake
    // Step 1
    Map<Integer,Integer> assetMap = new HashMap<Integer,Integer>();
    assetMap.put(i, mGameAssets[i].getDamage());
    // Step 2
    mapSnakes.put(++coutner, assetMap);
}

尽管您的设计看起来有些奇怪,但是您确定这是您想要做的吗?


在回应您的评论时,您说您想知道两件事:

  • mGameAsset有多少条蛇。
  • 它们是什么指数,它们的损害是什么。

您可以为此使用一个映射,该映射将索引映射到蛇本身,例如,假设您的资产属于Asset类:

private void filterSnakes () {

    // maps asset index => snake
    Map<Integer,Asset> snakes = new HashMap<Integer,Asset>(); 

    // find all the snakes:
    for (int i = 0; i < mGameAssets.length; ++ i) {
        if (mGameAssets[i].getAssetType().isSnake())
            snakes.put(i, mGameAssets[i]);
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    // now we can process their indices and damage, for example:
    for (Map.Entry<Integer,Asset> snakeEntry : snakes.entrySet()) {
        int index = snakeEntry.getKey();
        int damage = snakeEntry.getValue().getDamage();
        System.out.println("Snake at " + index + " damage is " + damage);
    }

    // and we can find the number of snakes too:
    int snakeCount = snakes.size();
    System.out.println("There are " + snakeCount + " snakes.");

    // bonus: we can even just get a generic collection of the snakes:
    Collection<Asset> snakesOnly = snakes.values();

}

如果要保留插入顺序,请使用LinkedHashMap

另一种选择是使用ArrayList或其他一些List代替Map 如果这样做,则必须制作一些可以容纳索引和蛇的小类(类似于Map.Entry<Integer,Asset> ,则可以为每个蛇条目创建一个小类并维护一个这些List ,还有更多工作要做,但是它的优点是没有地图的开销(这对您可能或不重要)。

  ask by Saeid Yazdani translate from so

未解决问题?本站智能推荐: