2011-04-24 39 views
0

我製作平鋪內存遊戲。我想在活動開始時用圖片初始化瓷磚。我嘗試這樣做:HashMap值問題()

private void initTiles() { 
    // Store name of resources in array 
    String[] pictures = new String[] {"tile_circle", "tile_deny", "tile_heart" 
        , "tile_mail", "tile_music", "tile_pin", "tile_splash", "tile_yes"}; 
    Random rand = new Random(); 

    int i = 1; 

    while(i <= 16) { 
     String pic = pictures[rand.nextInt(8)]; 
     LinkedList<String> list = new LinkedList<String>(); 

     list = (LinkedList<String>) tilesMapping.values(); 

     //Check if this picture is already loaded twice 
     if(list.indexOf(pic) == -1) { 
      tilesMapping.put(Integer.valueOf(i), pic); 
      i++; 
     } else if(list.lastIndexOf(pic) == -1) { 
      tilesMapping.put(Integer.valueOf(i), pic); 
      i++; 
     } else if(list.indexOf(pic) == list.lastIndexOf(pic)) { 
      tilesMapping.put(Integer.valueOf(i), pic); 
      i++; 
     } 

    } 
} 

但是當我開始遊戲時,我收到強制關閉。但是當評論這一行list = (LinkedList<String>) tilesMapping.values();遊戲開始。

回答

4

values()返回一個Collection,它不需要是LinkedList,所以也許發生ClassCastException。您可以通過使用拷貝構造函數獲取鏈表:

List list = new LinkedList(map.values()); // or ArrayList` 
+0

它的工作原理!非常感謝 :) – 2011-04-24 10:12:54

1

,代碼

LinkedList<String> list = new LinkedList<String>(); 
list = (LinkedList<String>) tilesMapping.values(); 

裏面你的foreach循環不右看看我的事實。我想它應該在循環之上。

此外,你可能並不是想要創建一個new LinkedList(),然後通過將該對象的唯一引用設置爲tilesMapping.values()的結果...這可能包含您之前準備的結果?

這給我們帶來了真正的問題:什麼是tilesMapping.values(),特別是它返回什麼類型?你不能僅僅通過類型轉換來將不是真的LinkedList的東西放到鏈接列表中。你可以欺騙編譯器,但它在運行時仍然不起作用。

乾杯。基思。