Java 在类图对象中寻找圈

Java 在类图对象中寻找圈,java,algorithm,recursion,graph,openstreetmap,Java,Algorithm,Recursion,Graph,Openstreetmap,我正在实现一些类似于图形的对象,我现在将描述这些对象 我有以下目标: 节点-包含两个双圆弧(纬度、经度)和两个圆弧(边)。 MeetingPointNode扩展节点-包含两个双精度(lat、lon)和八个圆弧。 Arc-包含节点列表(一些常规节点和一些集合点)。 环-包含弧的列表。(基本上它看起来像多边形) 我有以下问题:我需要从一个随机的集合点开始迭代,直到我回到同一个集合点,或者我进入了死胡同(我只迭代集合点,忽略常规节点)。 以下是我为实现这一目标而采取的措施: public void f

我正在实现一些类似于图形的对象,我现在将描述这些对象

我有以下目标:

节点-包含两个双圆弧(纬度、经度)和两个圆弧(边)。 MeetingPointNode扩展节点-包含两个双精度(lat、lon)和八个圆弧。 Arc-包含节点列表(一些常规节点和一些集合点)。 环-包含弧的列表。(基本上它看起来像多边形)

我有以下问题:我需要从一个随机的集合点开始迭代,直到我回到同一个集合点,或者我进入了死胡同(我只迭代集合点,忽略常规节点)。 以下是我为实现这一目标而采取的措施:

public void findRing(Node ringHead, Node current, List<Arc> arcs, Ring foundRing) {
        if (current == ringHead) {
            foundRing = new Ring();
            foundRing.setArcs(arcs);
            return;
        }

        for (int i = 0; i < 8; i++) {
           Arc currentArc = current.getArcs()[i];
           if (currentArc == null) {
                return;
           }

           arcs.add(currentArc);
           currentArc.setIsUsed(true);
           for (Node n : currentArc.getListOfNodes()) {
               if (n.getClass() != MeetingPointNode.class)
                   continue;
               findRing(ringHead, n, arcs, foundRing);

           }
           if (foundRing == null) {
              currentArc.setIsUsed(false);
              arcs.remove(current);
           }
       }
       return;
}
public void findRing(节点环形头、节点当前、列表弧、环形铸造){
如果(当前==光头){
铸造=新环();
铸造。设置弧(弧);
返回;
}
对于(int i=0;i<8;i++){
Arc currentArc=current.getArcs()[i];
如果(currentArc==null){
返回;
}
弧。添加(当前弧);
currentArc.setIsUsed(真);
对于(节点n:currentArc.getListOfNodes()){
if(n.getClass()!=MeetingPointNode.class)
继续;
findRing(环形头、n、圆弧、铸造);
}
if(founding==null){
currentArc.setIsUsed(假);
弧。删除(当前);
}
}
返回;
}
我将以以下格式调用该方法:
findrig(head,headNext/*head*/的下一个会面点,new ArrayList(),null)


我很乐意得到任何帮助。

您可以使用
链接数据库集
并在访问节点时存储节点。当您找到第一个副本时,您有一个


LinkedHashSet
保留元素插入集合的顺序,因此您可以轻松导出
路径。

如果我正确理解了算法,您实际上使用的是深度优先搜索,但您希望使用的是广度优先搜索。 bfs示例: