使用嵌套for循环搜索LinkedHashMap

时间:2013-08-06 23:48:21

标签: java search linkedhashmap

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

}

正常工作如果我给它的baseIndexseachIndex有关联,但如果不是,我不知道如何抓住...任何帮助将不胜感激。

1 个答案:

答案 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不应超过地图中的键数。