Java 添加到值部分为另一个HashMap的HashMap
如果这是一个noob问题,很抱歉,但是我正在琢磨如何在for循环中向以下映射添加值: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;
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中有多少条蛇