使用深度优先搜索生成迷宫图时出现ArrayIndexOutOfBoundsException错误 [duplicate]

我创建了一个程序,通过读取文本文件输入来解决迷宫问题。我使用深度优先搜索成功解决了这个问题,并且在小型迷宫上运行良好,如下所示:

11 32 30 31 45 45 76 77 88 99 100 5

解决小到中型迷宫时一切正常,但当迷宫变大时,会出现ArrayIndexOutOfBoundsException错误(见下文)。

输入迷宫文件:test2.txt输入起始节点:0输入目标节点:1Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 207    at MazeGraph.addArc(MazeGraph.java:95)    at MazeGraph.<init>(MazeGraph.java:51)    at MazeSystem.<init>(MazeSystem.java:25)    at MazeSystem.main(MazeSystem.java:37)Java Result: 1

我的程序应该自动读取test2.txt(这是大型迷宫文件)中的节点数量,但出现了这个错误。代码如下所示:

MazeGraph.java

import java.io.*;import static java.lang.System.out;import java.util.*;/** * 此类通过读取文本文件创建迷宫的图形表示。 * * @author Muhammad */public class MazeGraph {    final int node; //用于声明节点的常量值。    int arc;    List<Integer>[] adjacencyList;    static Set<Integer> setOfNodes = new HashSet<>();    private static Scanner scanNodeSize;    /**     * 此构造函数接受一个整数参数,用于读取节点索引到     * 邻接节点列表中。     *     * @param node - 整数参数,用于从文件中传递节点值     * 并创建邻接节点列表。     */    MazeGraph(int node) {        this.node = node;        this.arc = 0;//初始化为无弧        adjacencyList = (List<Integer>[]) new List[node];        for (int index = 0; index < node; index++) {            adjacencyList[index] = new LinkedList<Integer>();        }    }    /**     * 主要构造函数,接受一个字符串参数用于读取迷宫文件。     *     * @param mazeFile     */    public MazeGraph(String mazeFile) {        this(getNodeSize(mazeFile));        Scanner scan;        try {            //扫描迷宫文件。            scan = new Scanner(new File(mazeFile));            /*当有下一个整数时循环读取文件中的两个节点并为其添加弧。*/            while (scan.hasNextInt()) {                int node1 = scan.nextInt();                int node2 = scan.nextInt();                addArc(node1, node2);            }        } catch (FileNotFoundException ex) {            out.println(ex.getMessage());        }    }    /**     * 此方法通过接受一个字符串参数返回节点集的大小,     * 该参数为迷宫文件名。     *     * @param mazeFile - 字符串参数,用于读取迷宫文件以扫描     * 节点的大小。     * @return - 返回节点集的大小的整数值。     */    public static int getNodeSize(String mazeFile) {        try {            scanNodeSize = new Scanner(new File(mazeFile));            while (scanNodeSize.hasNextInt()) {                int node1 = scanNodeSize.nextInt();                int node2 = scanNodeSize.nextInt();                setOfNodes.add(node1);                setOfNodes.add(node2);            }            return setOfNodes.size();        } catch (FileNotFoundException e) {            e.printStackTrace();        }        return setOfNodes.size();    }    /**     * 此方法通过在名为邻接列表的数组中添加两个不同的节点来添加弧。     *     * @param node1 - 第一个节点。     * @param node2 - 第二个节点。     */    private void addArc(int node1, int node2) {        arc++; //每次调用此addArc方法时增加弧的数量。        adjacencyList[node1].add(node2);        adjacencyList[node2].add(node1);    }    //通过循环遍历邻接列表打印节点及其弧。    public void print() {        out.println(node + " 个节点," + arc + " 条弧 \n");        for (int fromNode = 0; fromNode < node; fromNode++) {            out.print(fromNode + " 连接到 ");            for (int arcNode : adjacencyList[fromNode]) {                out.print(arcNode + " ");            }            out.println();        }    }    /**     * 此方法返回一个节点列表,允许对象成为“for-each”语句的目标,     * 以便遍历节点。     *     * @param nodes - 一个整数参数,用于获取列表中的节点数量。     * @return - 返回一个节点列表。     */    public Iterable<Integer> getAdjacencyList(int nodes) {        return adjacencyList[nodes];    }}

在MazeGraph.java中,getNodeSize方法返回一个整数,用作构造函数的参数。为了使其工作,我必须在构造函数的参数中移除getNodeSize方法,取而代之的是放入一个较大的值,例如300。在堆栈跟踪中,它说问题出在addArc方法中。我试图找出如何解决这个问题,如果它已经在其他迷宫中工作,那么它也可以自动读取大型迷宫。请,如果有人能解决这个问题,我将不胜感激。

这是大型文件的内容。

0 20 30 200201 202202 203203 204204 205205 206206 207207 208209209 210210 211211 212212 213213 214214 215215 216216 217217 218218 219219 1185 1227 13415 16165 16534 1322 73173 18921 149204 71159 14866 97122 12535 6378 54147 84184 18380 203125 280 111125 72166 121145 15151 14074 152116 46138 202114 9127 133177 128202 13894 12230 3032 117125 16157 16187 150129 3755 353 118202 185187 185155 17479 107159 33143 186 9074 59161 6782 5777 127123 20438 96114 15092 13735 136118 79154 140109 203178 7213 20458 68 2898 42137 12359 95162 6922 14268 91155 90117 90143 10343 73153 28152 106160 18742 17115 15484 151163 977 12612 2831 9571 6337 110189 12898 115143 185124 18773 19458 19192 100133 93105 39124 191126 143136 3444 182199 168110 20220 169180 6487 166204 159110 125122 4105 11290 11124 138196 89179 114184 7038 3062 6826 34203 55204 6049 173107 9037 180156 92196 170193 10770 11068 13361 132176 125180 203160 165160 95204 2181 7825 13374 49199 11112 62203 16553 8133 190122 3886 17045 12775 117113 88138 189177 17643 141179 8024 166121 12612 12294 74106 16176 12693 72153 184202 11119 1330 10673 116149 202191 3216 3766 235 50115 104149 18972 5231 69111 164135 147109 14294 167196 1275 12164 20111 96183 171117 9687 10188 3689 141156 8452 24167 5867 10235 12973 84191 4512 102100 3366 3096 14082 19561 202144 17541 35140 123144 150194 10214 29161 84198 155188 190161 48197 75132 16065 89115 84104 4685 15535 18173 1176 68116 137170 17716 101151 189191 20133 3781 5153 13585 121147 1249 18698 17143 27123 1319 1919 20579 192197 15994 22203 1537 8320 195179 21125 183156 6592 104

回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注