以下是我的两个课程:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TopoSort {
public static void main(String[] args) throws FileNotFoundException {
File textFile = new File("graphs.txt");
Scanner in = new Scanner(textFile);
int numGraphs = in.nextInt();
for(int i=0;i<1;i++)
{
int nodeNum = in.nextInt();
tsMakeGraph graph1 = new tsMakeGraph(nodeNum);
int[][] adjArray = new int[nodeNum][nodeNum];
for(int j=0;j<nodeNum;j++)
{
for(int k=0;k<nodeNum;k++)
{
adjArray[j][k] = in.nextInt();
}
for(int n=0;n<nodeNum;n++)
{
graph1.addNode(n);
}
}
for(int j=0;j<nodeNum;j++)
{
for(int k=0;k<nodeNum;k++)
{
if(adjArray[j][k] == 1)
{
graph1.makeEdge(j, k);
}
}
}
graph1.topologicalSort();
}
}
}
和
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class tsMakeGraph {
private Node nodeList[];
private int adjMatrix[][];
private int numNodes;
private int topoArray[];
public tsMakeGraph(int nodeNum) {
nodeList = new Node[nodeNum];
adjMatrix = new int[nodeNum][nodeNum];
numNodes = 0;
for (int i = 0; i < nodeNum; i++) {
for (int k = 0; k < nodeNum; k++) {
adjMatrix[i][k] = 0;
}
}
topoArray = new int[nodeNum];
}
public void addNode(int i) {
nodeList[numNodes++] = new Node(i);
}
}
当我通过for循环添加节点时,我得到一个越界错误但是如果我通过绑定graph1.addNode(0),graph1.addNode(2),graph1.addNode(3)手动添加节点),graph1.addNode(numNodes),它会工作。这对我来说没有意义,我一直在绞尽脑汁哈哈。顺便说一句,我编辑了我的大部分拓扑图类,因为这是一个硬件项目。
答案 0 :(得分:1)
您的j和n索引for循环嵌套在TopoSort
中,因此您尝试将nodeNum*nodeNum
元素添加到大小为nodeNum
的数组(graph1.nodeList)中。
你可以消除一个循环,因为从0开始有两个循环到nodeNum:
tsMakeGraph graph1 = new tsMakeGraph(nodeNum);
int[][] adjArray = new int[nodeNum][nodeNum];
for(int j=0;j<nodeNum;j++) {
for(int n=0;n<nodeNum;n++) { // there was no need for two for loops here
adjArray[j][k] = in.nextInt();
graph1.addNode(n);
}
}
并制作nodeList
尺寸nodeNum*nodeNum
:
public tsMakeGraph(int nodeNum) {
nodeList = new Node[nodeNum*nodeNum];
adjMatrix = new int[nodeNum][nodeNum];
numNodes = 0;
//adjMatrix values will be 0 by default, don't need to manually do that
// this might need to be nodeNum*nodeNum as well, not used in your question
// if you get another out of bounds error later, remember this!
topoArray = new int[nodeNum];
}
我还将adjMatrix中每个值的手动设置删除为0,因为0是默认值,并且对于大量节点,O(n ^ 2)操作可能变得非常昂贵。
也许考虑使用nodeList替换nodeList(除非你的作业禁止这样做)。实际上,从j循环中拉出循环可能会更好,否则你将拥有每个节点的nodeNum
个副本。不确定你的用法,所以我无法真正帮助你。
请记住,如果nodeList的大小错误,topoArray也可以。
答案 1 :(得分:1)
稍微缩短代码你有这个:
for(int j=0;j<nodeNum;j++)
{
for(int n=0;n<nodeNum;n++)
{
graph1.addNode(n);
}
}
public class tsMakeGraph {
public tsMakeGraph(int nodeNum) {
nodeList = new Node[nodeNum];
}
public void addNode(int i) {
nodeList[numNodes++] = new Node(i);
}
}
所以这里发生的事情是你有一个包含nodeNum
个元素的数组,但是你要尝试添加nodeNum^2
次。
我不知道是什么意思告诉你'正确'的解决方案。如果nodeList
应该与adjMatrix
具有相同数量的元素,那么您应该像new Node[nodeNum * nodeNum]
一样对其进行实例化。 (与topoArray
相同?)或者如果nodeList
应包含整数0...nodeNum-1
,则应将其从嵌套循环中拉出来。
答案 2 :(得分:0)
使用此代码添加节点时:
for(int j=0;j<nodeNum;j++)
{
for(int n=0;n<nodeNum;n++)
{
graph1.addNode(n);
}
}
您实际上是在添加节点nodeNum * NodeNum次数。因此,例如,如果节点num为2,则添加节点2 * 2 = 4次。
但是初始化nodeList数组时如下:
nodeList = new Node[nodeNum];
您只是将其设置为nodeNum的大小。因此,如果nodeNum为2,则您的数组只能容纳2个值。但是由于你在添加时的代码:
nodeList[numNodes++] = new Node(i);
你正在递增numNodes,4次。这导致越界错误。
初始化你的nodeList数组,如下所示:
nodeList = new Node[nodeNum*nodeNum];
应解决问题