Java 如何获取到项目之间的所有路径

Java 如何获取到项目之间的所有路径,java,recursion,Java,Recursion,我必须计算列表中两个项目之间的所有可能路径。每个项目都有两个字段:其名称和邻居的名称 我必须生成一个包含所有项目的列表,允许我在两个特定项目之间创建路径 假设我有项目(A,B)和项目(A,C),有人问我从B到C的解决方案。我必须返回这两个项目,因为我可以使用它们从B到C:B->A->C 请注意,我对到达目的地所需的物品没有限制 我尝试过几种解决方案,但都没有成功。我知道我必须使用某种递归函数,但我不知道如何使用 这是我的项目类: public class Item { private S

我必须计算列表中两个项目之间的所有可能路径。每个项目都有两个字段:其名称和邻居的名称

我必须生成一个包含所有项目的列表,允许我在两个特定项目之间创建路径

假设我有项目(A,B)和项目(A,C),有人问我从B到C的解决方案。我必须返回这两个项目,因为我可以使用它们从B到C:B->A->C

请注意,我对到达目的地所需的物品没有限制

我尝试过几种解决方案,但都没有成功。我知道我必须使用某种递归函数,但我不知道如何使用

这是我的项目类:

public class Item {
    private String name;
    private String neighbor;

    public Item(String name, String neighbor){

        this.name = name;
        this.neighbor = neighbor;
    }

    //getters and setters
}
由于我必须获得两个特定项目之间的所有可能路径,因此我必须返回列表列表:

List<List<Item>> solution;
列表解决方案;
我的变通方法 最后,我将我的项转换为一个图,一旦构建完成,我就使用深度优先横向(DFT)来查找源和目标之间的所有可能路径

我设置键-值对,将每个项的名称与图形表示联系起来,并从图形中获得一个整数列表,该列表指示图形中的路径(例如,1-2-3-5)。从这个列表中,我找到了我的项目,并返回了一个列表,其格式我已经解释过了


只为有类似问题的人发帖

根据我的评论,试试这样的方法:

您可以迭代每个节点,并对其执行深度优先搜索 查看每个节点是否可以到达所需的节点

标记已访问的节点既可以避免循环(如果在您的用例中可能),也可以跟踪路径

List<Item> depthFirstSearch(Item startItem, Item desiredItem, List<Item> visitedNodes) {
    if (startItem.equals(desiredItem)) {
        return visitedNodes;
    }

     // Exit if we reach a cycle or no more neighbors to follow
    if (visitedNodes.contains(startItem) || startItem.getNeighbor() == null) {
        return null;
    }

    visitedNodes.add(startItem); 

     // Recurse; continue search from neighbor
    return depthFirstSearch(startItem.getNeighbor(), desiredItem, visitedNodes);
}
List depthFirstSearch(项startItem、项desiredItem、列表访问节点){
if(startItem.equals(desiredItem)){
返回访问的节点;
}
//如果我们到达一个循环或没有更多邻居跟随,则退出
if(visitedNodes.contains(startItem)| | startItem.getNeighbor()==null){
返回null;
}
visitedNodes.add(startItem);
//递归;从邻居继续搜索
返回depthFirstSearch(startItem.getNeighbor(),desiredItem,visitedNodes);
}
并像这样使用它(您需要根据您的代码进行调整):

列表项;
列表结果=新列表();
(项目:项目){
List pathToDesired=depthFirstSearch(项,desiredItem,new LinkedList());
如果(pathToDesired!=null){
结果。添加(pathToDesired);
}
}

result
将包含指向所需项的所有路径。

为什么不使用不同的数据结构(如有向图或无向图)更好地建模节点之间的关系?因为需要使用此数据结构确定,您可以迭代每个节点,并在每个节点上执行深度优先搜索,以查看是否可以到达所需的节点(将沿途的节点标记为已访问以避免循环)。您谈论的是列表,但您描述的至少是一棵树,更可能是一个无向图。所以:听起来您使用了完全错误的数据结构,如果首先确保使用正确的数据结构,您的问题就会变得容易得多。编写或使用简单的图形数据结构,使用父/子关系而不是“邻居”,您的搜索算法将变为“通过联系所有父节点和所有子节点(使用已联系节点的
seed
列表)尝试从这里到达X”。是的,我同意您@Mike'Pomax'Kamermans。我正在处理一个无向图。我的问题是,我必须使用此数据结构,因此我将尝试从我的数据创建一个无向图并使用该图。您的解决方案中存在一个问题,即项的相邻字段是字符串,而不是其他项。每个项都有两个字段,其名称和邻居名称。它表示两个项目之间的连接,而不是项目本身。啊,好的,在这种情况下,我将使用“name”作为键将您的项目存储在hashmap中。不要在
startItem.getNeighbor()
上递归,而是使用
startItem.getNeighbor()
作为键从hashmap获取实际项并在该项上递归:即
depthFirstSearch(itemMap.get(startItem.getNeighbor())、desiredItem、visitedNodes)是的,它可以工作。非常感谢你抽出时间。我最后做的是将我的数据转换成一个图,并按照您的建议使用DFT,在图中找到源和目标之间的所有路径。
List<Item> items;
List<List<Item>> result = new List<List<Item>>();

for (Item item : items) {   
    List<Item> pathToDesired = depthFirstSearch(item, desiredItem, new LinkedList<Item>());

    if (pathToDesired != null) {
        results.add(pathToDesired);
    }
}