Java 查找HashMap中的相邻对象之间的距离

Java 查找HashMap中的相邻对象之间的距离,java,Java,如果标题有点尴尬,我很抱歉,我不太确定如何表达我的问题 所以-我正在尝试建立一个棋盘游戏,我一直在尝试一种有效的方法来检查棋盘上各个区域之间的距离 我有一个“Territory”类,它为游戏板上的每个磁贴创建一个Territory对象。每个Territory对象都有一个“字符串名称”和一个“ListAdjacentTerritions”,其中包含与其相邻的所有区域的名称 我还有一个“HashMapterritoriesMap”,其中包含板上的所有区域 我提出的方法很管用,但它是硬编码的,用于检查

如果标题有点尴尬,我很抱歉,我不太确定如何表达我的问题

所以-我正在尝试建立一个棋盘游戏,我一直在尝试一种有效的方法来检查棋盘上各个区域之间的距离

我有一个“Territory”类,它为游戏板上的每个磁贴创建一个Territory对象。每个Territory对象都有一个“字符串名称”和一个“ListAdjacentTerritions”,其中包含与其相邻的所有区域的名称

我还有一个“HashMapterritoriesMap”,其中包含板上的所有区域

我提出的方法很管用,但它是硬编码的,用于检查距离首字母最多三个区域的内容,并且不是特别优雅。我想知道是否有一种方法可以更有效地完成这项任务,甚至可能有一种方法可以让我在任何距离执行此检查?如果我问这个问题时出错或错过了一些明显的答案,请原谅,我大多是自学成才

下面的函数接收我所有区域的HashMap,以及它要查找的两个区域(源和目标)之间的距离

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