Какую структуру данных мне нужно реализовать хэш-лист для хранения координат? - PullRequest
2 голосов
/ 01 декабря 2009

Мне нужно создать класс менеджера позиции, чтобы сказать, доступна ли позиция.

так что я попробовал это:

enter code here

public class PositionManager {</p> <pre><code>Hashtable currentPositions = new Hashtable(); void occupiedPosition(int x,int y){ this.currentPositions.put(new Integer("4"),new Integer("5")); this.currentPositions.put(new Integer("1"),new Integer("5")); this.currentPositions.put(new Integer("11"),new Integer("3")); this.currentPositions.put(new Integer("42"),new Integer("55")); this.currentPositions.put(new Integer("11"),new Integer("53")); Set keys = this.currentPositions.keySet(); // The set of keys in the map. Iterator keyIter = keys.iterator(); System.out.println("The map contains the following associations:"); while (keyIter.hasNext()) { Object key = keyIter.next(); // Get the next key. Object value = this.currentPositions.get(key); // Get the value for that key. System.out.println( " (" + key + "," + value + ")" ); } } public static void main(String[] args) { new PositionManager().occupiedPosition(3, 3); }

}

Конечно, это всего лишь тест, я пытаюсь восстановить все используемые позиции, проблема в том, что у меня не может быть дубликатов ключей. так какую структуру данных я должен использовать. заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

Я бы подошел к этой проблеме вот так, просто создав набор позиций. Набор моделирует коллекцию объектов, которые могут встречаться только один раз. В сравнении структура карты хранит набор связей ключ / значение. Из моего прочтения вашего вопроса я думаю, что структура набора имеет больше смысла.

// You might just be able to use an existing Point depending on what you
// want to do with the position
class Position {
  int x;
  int y;

  // implementations of hashCode() + equals()
  }
}

Вам необходимо реализовать hashCode (), чтобы элементы могли распределяться равномерно в наборе, и equals () для сравнения объектов. См. здесь для получения дополнительной информации.

Set<Position> positions = new HashSet<Position>();
positions.add(new Position(3,4));
positions.add(new Position(5,6)); // and so on

Убедитесь, что вы правильно определили equals / hashCode (для этого есть множество ссылок)

Теперь вы можете проверить, находится ли точка в наборе, с помощью такого метода, как:

positions.contains(new Point(2,1)); // returns false
positions.contains(new Point(3,4)); // returns true
0 голосов
/ 01 декабря 2009

Я бы предложил использовать google-collection's MultiMap. Это фактически управляемый тип для Map<K, Collection<V>>.

Также интерес может представлять класс Multimaps, который дает вам Multimap<K,V> invertFrom(Multimap<V,K>)

Тогда вы можете получить:

public boolean isPositionOccupied(int x, int y) {
    return occupiedPositionsMap.get(x).contains(y);
}

См? Вот Это Да! нет необходимости в нулевых проверках или другой ерунде.

Примечание : Это относительно оптимально с точки зрения производительности, но в зависимости от ваших других потребностей вы можете использовать Point объекты, как отмечено в других ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...