Java 添加到值部分为另一个HashMap的HashMap

Java 添加到值部分为另一个HashMap的HashMap,java,hashmap,Java,Hashmap,如果这是一个noob问题,很抱歉,但是我正在琢磨如何在for循环中向以下映射添加值: private void filterSnakes() { Map<Integer, Map<Integer, Integer>> mapSnakes = new HashMap<Integer, Map<Integer, Integer>>(); int coutner = 0; for(int i = 0;

如果这是一个noob问题,很抱歉,但是我正在琢磨如何在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() );
        }
    }
}
private void filternakes(){
地图蛇
=新HashMap();
int-coutner=0;
对于(int i=0;i

我的意思是如何在
mapSnakes
中添加一个新条目,关键部分可以,但值部分本身是一个映射,它又如何呢?

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

  • 创建要插入的地图
  • 将其插入
    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);
    }
    
    如果要保留插入顺序,请使用


    另一种选择是使用
    数组列表
    或其他一些
    列表
    ,而不是
    映射
    ;如果您这样做,您将不得不创建一些可以保存索引和snake的小类(类似于
    Map.Entry
    ),然后您可以为每个snake条目创建其中一个小类,并维护其中的
    列表。这需要做更多的工作,但其优点是没有映射的开销(这可能对您来说很重要,也可能不重要).

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

  • 创建要插入的地图
  • 将其插入
    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);
    }
    
    如果要保留插入顺序,请使用


    另一种选择是使用
    数组列表
    或其他一些
    列表
    ,而不是
    映射
    ;如果这样做,则必须创建一些可以容纳索引和蛇的小类(类似于
    Map.Entry
    ,然后您可以为每个snake条目创建一个这样的小类,并维护其中的
    列表。这需要做更多的工作,但其优点是没有映射的开销(这可能对您来说并不重要)。

    您需要首先创建或获取嵌套映射:

    ++counter;
    if (!mapSnakes.containsKey(counter)) {
      mapSnakes.put(counter, new HashMap<Integer, Integer>());
    }
    
    mapSnakes.get(counter).put(i,mGameAssets[i].getDamage());
    
    ++计数器;
    如果(!mapsneakes.containsKey(计数器)){
    put(计数器,newhashmap());
    }
    get(counter).put(i,mGameAssets[i].getDamage());
    

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

    您需要首先创建或获取嵌套映射:

    ++counter;
    if (!mapSnakes.containsKey(counter)) {
      mapSnakes.put(counter, new HashMap<Integer, Integer>());
    }
    
    mapSnakes.get(counter).put(i,mGameAssets[i].getDamage());
    
    ++计数器;
    如果(!mapsneakes.containsKey(计数器)){
    put(计数器,newhashmap());
    }
    get(counter).put(i,mGameAssets[i].getDamage());
    

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

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

        mapSnakes.put(++counter, i,mGameAssets[i].getDamage() );
    
    必须是这样的:

        Map<Integer, Integer> submap = ...
        mapSnakes.put(++counter, submap);
    
    映射子映射=。。。
    mapsneakes.put(++计数器,submap);
    
    …或者可能是@dimoniy的答案(不清楚,因为您没有指定如何初始化数据结构。我可以猜,但我今天上午没有玩这个游戏。)


    其他要点包括:

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

    • 无论是在内存使用还是在时间上,映射都是非常昂贵的数据结构。每当您必须使用
      Integer
      而不是
      int
      ,都会由于装箱和拆箱而产生开销


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

        mapSnakes.put(++counter, i,mGameAssets[i].getDamage() );
    
    必须是这样的:

        Map<Integer, Integer> submap = ...
        mapSnakes.put(++counter, submap);
    
    映射子映射=。。。
    mapsneakes.put(++计数器,submap);
    
    …或者可能是@dimoniy的答案(不清楚,因为您没有指定如何初始化数据结构。我可以猜,但我今天上午没有玩这个游戏。)


    其他要点包括:

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

    • 无论是在内存使用还是在时间上,映射都是非常昂贵的数据结构。每当您必须使用
      Integer
      而不是
      int
      ,都会由于装箱和拆箱而产生开销


    如果要使用增量数字来索引内容,有没有理由使用hashmap而不是数组?@fejese只是为了方便访问我想的内容。如果要使用增量数字来索引内容,有没有理由使用hashmap而不是数组?@fejese只是为了方便访问我想的内容。这是一个很好的通用策略ategy,尽管在OP的示例中,
    mapSnakes
    是新创建的,并且是空的,
    i
    从不重复;
    containsKey()
    将始终为false,“fetch/create”将始终为“create”@JasonC是的,很好。我只是选择了一种通用方法,在没有特定键顺序的情况下,必须将多个值放入嵌套映射中。这是一种很好的通用策略,尽管在OP的示例中,
    mapsakes
    是新创建的,是空的,
    I
    从不重复;
    containsKey()
    将始终为false,并且“获取/创建”将始终是“创建”"@JasonC是的,很好。我只是选择了一种通用方法,在没有特定键顺序的情况下,你必须将多个值放入一个嵌套的映射中。谢谢你的解决方案。关于设计,我想知道
    mGameAsset
    数组中有多少蛇,它们在数组中的索引是什么,它们有多大的伤害。你能提出建议吗更好的吗?谢谢你的解决方案。关于设计,我想知道在
    mGameAsset
    arr中有多少条蛇