Java 查找HashMap中的相邻对象之间的距离
如果标题有点尴尬,我很抱歉,我不太确定如何表达我的问题 所以-我正在尝试建立一个棋盘游戏,我一直在尝试一种有效的方法来检查棋盘上各个区域之间的距离 我有一个“Territory”类,它为游戏板上的每个磁贴创建一个Territory对象。每个Territory对象都有一个“字符串名称”和一个“ListJava 查找HashMap中的相邻对象之间的距离,java,Java,如果标题有点尴尬,我很抱歉,我不太确定如何表达我的问题 所以-我正在尝试建立一个棋盘游戏,我一直在尝试一种有效的方法来检查棋盘上各个区域之间的距离 我有一个“Territory”类,它为游戏板上的每个磁贴创建一个Territory对象。每个Territory对象都有一个“字符串名称”和一个“ListAdjacentTerritions”,其中包含与其相邻的所有区域的名称 我还有一个“HashMapterritoriesMap”,其中包含板上的所有区域 我提出的方法很管用,但它是硬编码的,用于检查
public void checkDistance(字符串源、字符串目标、HashMap territoriesMap){
int targetDistance=0;
List sourceAdj=territoriesMap.get(source.getAdjacentTerritory();
如果(sourceAdj.contains(target)){targetDistance=1;}
否则{
for(字符串邻接1:sourceAdj){
List nextAdj=territoriesMap.get(adjacent1.getAdjacentTerritory();
如果(nextAdj.contains(target)){targetDistance=2;}
否则{
for(字符串邻接2:nextAdj){
List lastAdj=territoriesMap.get(adjacent2.getAdjacentTerritory();
如果(lastAdj.contains(target)){targetDistance=3;}
}
}
}
}
系统输出打印项次(目标距离);
我觉得我离…很近,但我在想如何简化这项工作时遇到了困难。任何帮助都将不胜感激,甚至将我引向阅读材料都将是巨大的帮助。我们可以用它来计算这些距离。下面是一个示例实现:
public int computeDistance(String source, String target, Map<String, Territory> territoriesMap) {
Queue<String> q = new ArrayDeque<>();
Map<String, Integer> dist = new HashMap<>();
q.add(source);
dist.put(source, 0);
while (!q.isEmpty()) {
Territory cur = territoriesMap.get(q.poll());
int curDist = dist.get(cur.getName());
for (String neighbor : cur.getAdjacentTerritories()) {
if (neighbor.equals(target))
return curDist + 1;
if (!dist.containsKey(neighbor)) {
dist.put(neighbor, curDist + 1);
q.add(neighbor);
}
}
}
return -1; // not connected by a path
}
public int计算距离(字符串源、字符串目标、地图地域地图){
队列q=新的ArrayDeque();
Map dist=new HashMap();
q、 添加(来源);
dist.put(源,0);
而(!q.isEmpty()){
Territory cur=territoriesMap.get(q.poll());
int curDist=dist.get(cur.getName());
for(字符串邻居:cur.getAdjacentTerritions()){
if(邻居等于(目标))
返回curDist+1;
如果(!dist.containsKey(邻居)){
dist.put(邻居,curDist+1);
q、 添加(邻居);
}
}
}
return-1;//未通过路径连接
}
注意,通过小的修改(实际上是简化),我们可以找到从震源到所有可到达目标的距离,如下所示:
public Map<String, Integer> computeAllDistances(String source, Map<String, Territory> territoriesMap) {
Queue<String> q = new ArrayDeque<>();
Map<String, Integer> dist = new HashMap<>();
q.add(source);
dist.put(source, 0);
while (!q.isEmpty()) {
Territory cur = territoriesMap.get(q.poll());
int curDist = dist.get(cur.getName());
for (String neighbor : cur.getAdjacentTerritories()) {
if (!dist.containsKey(neighbor)) {
dist.put(neighbor, curDist + 1);
q.add(neighbor);
}
}
}
return dist;
}
公共地图计算所有距离(字符串源、地图地域地图){
队列q=新的ArrayDeque();
Map dist=new HashMap();
q、 添加(来源);
dist.put(源,0);
而(!q.isEmpty()){
Territory cur=territoriesMap.get(q.poll());
int curDist=dist.get(cur.getName());
for(字符串邻居:cur.getAdjacentTerritions()){
如果(!dist.containsKey(邻居)){
dist.put(邻居,curDist+1);
q、 添加(邻居);
}
}
}
返回距离;
}
您正在寻找的算法是广度优先搜索。尝试了解一下这一点,看看它是否解决了您的问题。这种具有关系的数据结构称为图形
。看看例如。此库对搜索没有帮助,但至少在实现抽象数据类型时是如此(带字符串键的hashmaps有些笨拙)。所有边权重都是单位成本,正如OP问题中的代码所暗示的。在这种情况下,BFS正确地找到了最短路径。是的,你是正确的。我将撤回我的评论并回答。
public Map<String, Integer> computeAllDistances(String source, Map<String, Territory> territoriesMap) {
Queue<String> q = new ArrayDeque<>();
Map<String, Integer> dist = new HashMap<>();
q.add(source);
dist.put(source, 0);
while (!q.isEmpty()) {
Territory cur = territoriesMap.get(q.poll());
int curDist = dist.get(cur.getName());
for (String neighbor : cur.getAdjacentTerritories()) {
if (!dist.containsKey(neighbor)) {
dist.put(neighbor, curDist + 1);
q.add(neighbor);
}
}
}
return dist;
}