2013-07-10 2 views
1

Вопрос начального: у меня есть hashmap, который хранит массив целых чисел в качестве значений. Ключ для каждого значения - это объект, который состоит из двух целых чисел (координат).Java Hashmap получает значение из ключа объекта

Мой вопрос: как я могу получить значение из хэш-карты, основанной на двух координатах внутри моего объекта (мой «ключ»)?

Мои Coords Класс (с небольшой помощью 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; 
    } 

} 

Строительство 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); 

     } 
    } 

Если я хочу, чтобы получить доступ к массиву по координатам 12,13, как я могу получить его? Итерация необходима (надеюсь, нет, я хочу добавить 100 000 + координаты и быстрый доступ к курсу).

Я надеялся, что это будет работать несколько в линии

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

Я надеюсь, что вы можете мне помочь. заранее спасибо!

+0

Вы отправили ответ в вопрос: 'int [] theValues ​​= map.get (новые Coords (12,13));' как это работает. – jlordo

+2

Почему вы думаете, что ваш прием не будет работать? – Ayman

+0

Вы правильно переопределили метод 'equals' в вашем классе' Coords', поэтому ваш вызов 'map.get' должен работать так, как вы хотите, чтобы он отвечал –

ответ

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

    } 
+0

Спасибо всем, особенно Джим! Это сделал трюк ... Все еще учусь :-) – user2150129

1

У вас есть одна ошибка: вы используете только один массив и много ссылок на него.

Перемещение этой линии

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

выше или ниже этой линии:

coords = new Coords(i, j); 

, чтобы исправить это.

+0

Спасибо за ваш ответ, вы действительно помогли мне здесь – user2150129

Смежные вопросы