2014-04-20 89 views
0

很抱歉,如果這是一個noob問題,但我抓我的頭如何將值添加到下面的地圖裏面一個for循環:添加到一個HashMap其值的部分是另一個HashMap中

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中添加一個新條目,關鍵部分是好的,但價值部分本身是一個地圖怎麼樣?

+0

是否有任何理由使用散列表而不是數組,如果你會使用增量數字來索引它? – fejese

+0

@fejese只是簡單的訪問內容我猜。 –

回答

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。工作,但有沒有一個地圖的開銷(這可能會或可能無所謂你)的優勢

+0

感謝您的解決方案。關於這個設計,我想知道'mGameAsset'數組中有多少蛇,以及數組中的索引是什麼,以及它們的損害。你能提出更好的建議嗎? –

+0

@ Sean87我已經用一個建議更新了我的答案。 –

2

您需要首先創建或獲取嵌套地圖:

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

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

在上面的代碼如果它不存在,則創建嵌套地圖。接下來,您將獲得具有mapSnakes.get(counter)的地圖並將其添加到嵌套地圖中。

+0

這是一個很好的總體策略,雖然在OP的例子中'mapSnakes'是新建的,並且是空的,''我永遠不會重複; 'containsKey()'將始終爲false,「fetch/create」將始終爲「create」。 –

+0

@JasonC喲,很好。我只是去了一個普遍的方法,你必須把幾個值放入一個嵌套的地圖,沒有特定的鍵的順序 – dimoniy

2

您已將地圖聲明爲從整數映射到地圖。因此

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

需要是這樣的:

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

...或可能像@ dimoniy的答案。 (目前尚不清楚,因爲您實際上並未指定如何您想要初始化數據結構。我可以猜測,但我不是今天早上玩遊戲)


要做出的其他點是:

  • 這看起來像一個可憐的面向對象的設計。 Java中基本類型地圖的地圖具有「代碼味道」。通常這意味着你應該定義一些應用程序類。

  • 地圖是相當昂貴的數據結構,無論是在內存使用情況還是在時間。而且,如果您必須使用Integer而不是int,則會因爲裝箱和拆箱而招致開銷。

+0

感謝您的提示! –

相關問題