1

初学者问题:我有一个哈希图,它将整数数组存储为值。每个值的键是一个由两个整数(坐标)组成的对象。

我的问题:如何根据对象中的两个坐标(我的“键”)从哈希图中检索一个值?

我的坐标类(在 Eclipse 的帮助下):

    public class Coords {
    int x;
    int y;

    public Coords(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + x;
        result = prime * result + y;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Coords other = (Coords) obj;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }

}

构建哈希图:

public class BuildMap {

public Coords coords;
public int[] someData = new int[4];
public Random random = new Random();
HashMap<Coords, int[]> map = new HashMap<Coords, int[]>();

public void buildHashMap() {

    // coordinates from (0,0) to (31,31)
    for (int i = 0; i < 32; i++) {
        for (int j = 0; j < 32; j++) {

            coords = new Coords(i, j);

            // Every Coord gets a few random numbers
            for (int k = 0; k < 4; k++) {
                someData[k] = random.nextInt(8564);
            }

            map.put(coords, someData);

        }
    }

如果我想访问坐标 12,13 上的数组,我该如何检索它?是否需要迭代(我希望不需要,我想添加 100,000 多个坐标和快速访问当然)。

我希望这会在某种程度上起作用

int[] theValues = map.get(new Coords(12,13));

我希望你能帮助我。提前致谢!

4

2 回答 2

3

问题在于您如何构建地图。

您正在添加与每个元素的值相同的数组。

您需要为每个元素实例化一个新数组。

for (int i = 0; i < 32; i++) {
    for (int j = 0; j < 32; j++) {

        coords = new Coords(i, j);
        int[] someData = new int[4];   // <==== create a new array for each Map value
        // Every Coord gets a few random numbers
        for (int k = 0; k < 4; k++) {
            someData[k] = random.nextInt(8564);
        }

        map.put(coords, someData);

    }
于 2013-07-10T19:54:21.420 回答
1

你有一个错误:你只使用了一个数组,并且对它有很多引用。

移动这条线

public int[] someData = new int[4]; // without public 

高于或低于这条线:

coords = new Coords(i, j);

要解决这个问题。

于 2013-07-10T19:55:49.413 回答