HashMap值的问题()

时间:2011-04-24 10:03:45

标签: java collections

我制作瓷砖记忆游戏。我想在活动开始时用图片初始化瓷砖。我试着这样做:

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();游戏开始时。

2 个答案:

答案 0 :(得分:4)

values()返回Collection,它不需要是LinkedList,因此可能会发生ClassCastException。您可以使用复制构造函数获取链接列表:

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

答案 1 :(得分:1)

代码

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

在你的foreach循环内部看起来不对我。我想它应该高于循环。

此外,您可能并不是要创建一个new LinkedList(),然后立即将其抛弃,方法是将该对象的唯一引用设置为tilesMapping.values() ...的结果...(推测)包含你之前准备的,是吗?

这给我们带来了真正的问题:什么是tilesMapping.values(),具体是什么类型的回归?你不能只是通过类型转换来创建一个非LinkedList的字符串链接列表。你可以欺骗编译器,但它仍然无法在运行时运行。

干杯。基思。