我有LinkedHashMap
喜欢这样
LinkedHashMap <Integer, ArrayList<Integer>> indexToIndecies = new LinkedHashMap <Integer ,ArrayList<Integer>>();
我有一个方法public int searchGraph(int baseIndex, int searchIndex, int count)
这种搜索方法的重点是;当某人输入baseIndex
这是一个关键字时,必须找到到达searchIndex
所需的“点击次数”。键的值是它们相关的索引。因此,“点击”将从一个键转到另一个键。所以如果我的hashmap看起来像:
0[2]
1[0, 3]
2[0, 5]
3[0, 2, 4, 5]
4[5]
5[2]
6[3, 4, 5]
7[1, 4]
从0到5获得两次点击。
所以这是我的方法代码:
public int searchGraph(int baseIndex, int searchIndex, int count)
{
if (baseIndex == searchIndex)
{
return count;
}
if (searchIndex > indexToIndecies.size()-1){
return -3;
}
else{
for (int i = 0; i < indexToIndecies.get(baseIndex).size(); i++)
{
for (int x = 0; x< indexToIndecies.get(baseIndex).size(); x++){
if (indexToIndecies.get(baseIndex).get(x) == searchIndex){
return count;
}
else{
count++;
}
}
baseIndex = (indexToIndecies.get(baseIndex)).get(i);
}
return count;
}
}
正常工作如果我给它的baseIndex
和seachIndex
有关联,但如果不是,我不知道如何抓住...任何帮助将不胜感激。
答案 0 :(得分:2)
现在你没有考虑从baseIndex到searchIndex可能有多条路径的可能性 - 如果是这种情况,你可能想要最短的路径。解决此问题的一种方法是使用递归调用的单个for循环替换嵌套的for循环。如果找不到路径,则返回Integer.MAX_VALUE
,如果您的最短路径的计数为Integer.MAX_VALUE
,那么您将知道您无法找到路径。 (如果您发现计数为Integer.MAX_VALUE
的路径,那么您的路径查找算法可能出现问题 - 您不应该有那么长的路径。)如果您想使用嵌套循环而不是递归然后,您可以使用自己的堆栈变量将递归调用转换为循环。
public int searchGraph(int baseIndex, int searchIndex, int count) {
if(baseIndex == searchIndex) {
return count;
} else if(count > indexToIndecies.size()) {
return Integer.MAX_VALUE; // cycle in graph
} else {
int returnVal = Integer.MAX_VALUE;
for(int i = 0; i < indexToIndecies.get(baseIndex).size(); i++) {
int temp = searchGraph(indexToIndecies.get(baseIndex).get(i), searchIndex, count + 1);
returnVal = temp < returnVal ? temp : returnVal;
}
return returnVal;
}
}
这应返回最短路径,如果返回Integer.MAX_VALUE
,则找不到路径。
另一种选择是返回Integer
而不是int
,在这种情况下,如果找不到路径,则可以返回null。
编辑:SimonC在评论中指出图中的循环可能导致堆栈溢出。如果Integer.MAX_VALUE
超过count
,我会通过返回indexToIndecies.size()
来更正此问题,因为count
不应超过地图中的键数。