简体   繁体   中英

Java Hashmap get value from object key

Beginner question: I have a hashmap which stores an array of integers as values. The key for each value is an object which consists of two integers (coordinate).

My question: how can I retrieve a value from the hashmap, based on the two coördinates within my object (my 'key')?

My Coords Class (with a little help from 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;
    }

}

Building the Hashmap:

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);

        }
    }

If I want to access the array on coordinates 12,13, how can I retrieve it? Is iteration needed (I hope not, I want to add 100,000+ coordinates and quick access ofcourse).

I was hoping this would work somewhat in the line of

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

I hope you can help me. thanks in advance!

The problem is in how you construct the Map.

You are adding the same array as the value for each element.

You need to instantiate a new array for each element.

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);

    }

You have one mistake: you are only using one array, and many references to it.

Move this line

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

above or below this line:

coords = new Coords(i, j);

to fix it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM