我需要什么样的数据结构来实现用于存储坐标的哈希表?

时间:2009-12-01 20:37:12

标签: java data-structures

我需要建立一个职位经理课来告诉我职位是否可用。

所以我试过这个:

enter code here

public class PositionManager {

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

}

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 个答案:

答案 0 :(得分:3)

我通过创建一组位置来解决这个问题。集合模拟只能出现一次的对象集合。相比之下,映射结构存储一组键/值关联。从我对你的问题的解读,我认为一组结构最有意义。

// 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(),以便可以在set和equals()中统一分配项目,以便可以比较对象。有关详细信息,请参阅here

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

确保正确定义equals / hashCode(这里有很多链接)

现在,您可以使用contains方法测试点是否在集合中,例如:

positions.contains(new Point(2,1)); // returns false
positions.contains(new Point(3,4)); // returns true

答案 1 :(得分:0)

我建议使用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个对象。