我正在尝试将16 x 16乘以16并包含每个点的值。 每个点是一个16位整数(短)。

我不断收到此错误:

Exception in thread "main" java.lang.NullPointerException
    at Chunk.getBlock(Chunk.java:42)
    at Foo.main(ChunkTest.java:12)

这是我的代码:

import java.util.HashMap;

public class Chunk {
    private HashMap<Byte, HashMap<Byte, Short>> tiles = new HashMap<Byte, HashMap<Byte, Short>>();

    public Chunk() {
        HashMap<Byte, Short> tile;

        //Create 16 tiles
        for(byte i = 0; i<16;i++) {
            System.out.println(i);
            tile = new HashMap<Byte, Short>();

            //Fills the tile with the default value, 1
            for(short e = 0; e<256;e++) {
                System.out.println(e);
                tile.put((byte) e, (short) 1);
            }

            tiles.put(i, tile);

        }
    }

    //Should return the id(short) at the specified coordinates.
    public short getBlock(byte x, byte y, byte z) {
        HashMap<Byte, Short> tile = tiles.get(y);

        short block = tile.get(x+(z*16)); //Line 42

        return block;
    }

}

我已经阅读了5次代码,但仍然不知道出了什么问题。 据我所读,应该可以制作一个双重HashMap。

那么,如何制作一个并检索其值呢?

===============>>#1 票数:1 已采纳

tile.get( x+(z*16) );

由于数值提升,该表达式x+(z*16)会将其所有操作数都转换为int 所以发生的事情是,由于Map#getObject作为参数,结果被装箱到Integer 尽管在数值上相等,但Integer永远不等于Byte ,因为也有类型检查。

尝试以下方法:

tile.get((byte) ( x+(z*16) ));

假设结果始终在0到255之间,那应该可以工作。(但请注意,由于byte是带符号的,因此强制转换将大于127的值转换为负数。)


考虑一下,如果您的图块索引值始终落在很小的范围内,则可以考虑使用数组作为表而不是Map

就像是:

short[][] tiles = new short[16][256];

for (int i = 0; i < 16; ++i)
    for (int e = 0; e < 256; ++e)
        tiles[i][e] = 1;

您避免装箱转换和数字促销问题。 是否更好取决于您正在做什么以及是否要使用put / get之外的其他操作。

  ask by KaareZ translate from so

未解决问题?本站智能推荐:

1回复

Java hashmap到矩阵的转换

我启动了一个哈希图和一个嵌套的哈希图来存储术语,它的出现和频率。 它给了我输出:{cancel = {WET4793.txt = 16,WET5590.txt = 53},unavailable = {WET4291.txt = 10},station info = {WET2266.t
1回复

将矩阵的HashMap写入文件Java

我创建了这个HashMap,用于存储(2,1)大小的矩阵。 我想将此HashMap存储到一个文件中,以便我可以通过Ftp发送它,但是在接收时,它应该采用一种允许我轻松检索矩阵并在以后使用的格式。 有什么建议吗? 非常感谢你。
1回复

包含相同值的哈希图

嗨,我使用hashMap包含整数作为键和矩阵列表作为值,这是代码 问题是返回的hashMaps的最终版本包含最后一个矩阵的10倍,事情是它在循环中运行良好,因为我每次都看到不同的值,但是一旦我在返回之前打印值,所有现在,这些值具有相同的最后一个矩阵。 编辑:矩阵类来自Jama包。
1回复

带有哈希图打印的矩阵表

死堆栈溢出, 我通过Hadoop编写了代码,以编写一个从文本文件读取值的矩阵表。 基本上,它必须读取一个字符在某个其他字符之后出现了多少次。 尽管我的代码已经在hadoop中,但是我已经拥有了这些值,并将它们放入一个hashmap>并将它们传递给一个名为Frequency表的
1回复

使用org.javatuples.Pair和HashMap创建密集矩阵太慢

我有一个大小约为30000 X 30000的密集对称矩阵,其中包含字符串之间的距离。 由于距离是对称的,因此矩阵的上三角存储在以下形式的制表符分隔的三列文件中: 我使用HashMap和org.javatuples.Pair创建地图,以快速查找给定字符串对的距离,如下所示: da
2回复

检索放入HashMap中的数组

下面的代码是我针对一个问题的答案,该问题要求将nxn 2D矩阵旋转90度(顺时针),而无需创建新的2D数组。 例如 我试图逐行执行此操作,但是必须解决的问题是如果该对索引已更改,该怎么办。 因此,如果我尝试将索引对[1,2]分配给[0,1],但是[0,1]之前已经更改过。 我想出的
1回复

为什么我的Hashmap无法注册(工作)

抱歉,标题不够详尽,因为我还很新。 只是发生了什么事,我想注册一个食谱(请参见下面的代码)。 然后,我要检查输入配方是否与注册配方匹配。 我正在通过哈希映射和数组。 所以我的问题是,当我进行测试时,注册配方没有出现。 我对hashmaps,arrays方法是否做错了,如果可以
3回复

从哈希图检索数组

我正在尝试创建一个具有String键并存储Integer数组的哈希映射。 使用hashmap.get() ,我想检索存储的数组。 我习惯于以下代码: 我得到的输出是: 谁能帮忙!
3回复

无法访问和引用Java中的HashMap

我正在尝试编写一个程序来处理学生和相应学科的存储,但是对于Java的Lists来说相对较新,并且在使班级存储和输出学生和学科方面遇到困难。 到目前为止,我可以存储一个学生和一个班级,但是不会花很多时间,或者只返回最近添加的课程。 调用getCohort()我试图获取返回已登录的所有学生
3回复

通过哈希图从文本文件中检索变量

我正在为一个项目创建学校程序,其中我将单词和翻译写成文件(用字符分隔)。 我读过我可以通过哈希映射将它们读入数组。 我只是想知道是否有人可以为我指出正确的方向。 如果有人对如何存储和检索我想学习的单词有更好的主意。 我写入文件的原因是,用户可以存储所需数量的单词。 非常感谢你: