【发布时间】:2014-02-23 03:00:54
【问题描述】:
我正在做一个广度优先搜索程序,它将读入一个邻接列表类型的文本文件,然后相应地对其执行 BFS。我无法读取文本文件,然后将其添加为节点数组列表。
我如何让它正确读取每一行并为其关联连接?
我已经通过在我的 main 中手动添加节点,然后制作一个图表并在其上执行 BFS 来测试我的程序。
这是我的节点类:
import java.util.*;
public class Node {
public String data; // data element
public boolean visited=false; // flag to track the already visited node
public List<Node> adjacentNodes = new LinkedList<Node>(); // adjacency list
// public List adjacentNodes = new LinkedList(); // adjacency list
public Node rootNode;
public Node(String data){
this.data = data;
}
public void addAdjacentNode(final Node node){
adjacentNodes.add(node);
node.adjacentNodes.add(this);
// adjacentNodes.add(rootNode);
// node.adjacentNodes.add(this)
}
}
这是我的 Graph 类:(我试图在我的文本文件中读取的位置在我的主文件中)
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.*;
/*- enqueue the start node to a Queue
- make the start node as visited
- while queue is not empty
- dequeue the node lets say u
- print or whatever you want to
- for every adjacent node v of u
- if v is not already visited
- mark v as visited
- enqueue v to the Queue*/
public class Graph {
public List nodes = new ArrayList();
public void breadthFirstTraversal(Node rootNode){
Queue<Node> q = new LinkedList<Node>();
// Queue q = new LinkedList();
q.add(rootNode);
System.out.print(rootNode.data + " ");
// printNode(rootNode);
rootNode.visited=true;
while(!q.isEmpty()){
Node n = (Node)q.poll();
System.out.print(n.data + " ");
for(Node adj : n.adjacentNodes){
if(!adj.visited){
adj.visited=true;
q.add(adj);
}
}
clearNodes();
}
}
private void clearNodes() {
// TODO Auto-generated method stub
nodes = null; //clear nodes and set to null
}
/* private void printNode(Node node) {
// TODO Auto-generated method stub
System.out.print(node);
}*/
public static void main(String[] args) throws FileNotFoundException {
Graph g = new Graph();
Scanner scan = new Scanner(new File("Connections.txt")); // scanner to read file
String line = scan.nextLine(); // read first line
int nbLine = Integer.parseInt(line); // get number of lines
ArrayList<int[]> al = new ArrayList<int[]>();
for(int i = 0; i < nbLine; i++) { // read each line
line = scan.nextLine();
String[] token = line.split(" "); // split each number into different String
int[] points = new int[token.length - 1]; // prepare array of int[] - 1
// int[] point = new int[];
int[] point = new int[token.length];
for(int j = 0; j < token.length; j++){ // skip first one
points[j-1] = Integer.parseInt(token[j]); // store as int
al.add(points); // save in ArrayList
}
/* Scanner s = new Scanner(new File("C:/Users/cantuj3/Documents/Ass 2/Connections.txt"));
ArrayList<Node> list = new ArrayList<Node>();
while (s.hasNext()){
g.nodes.add(s.next());
//list.add(g);
}
s.close();*/
/* Node frankfurt = new Node("frankfurt");
Node mannheim = new Node("mannheim");
Node wurzburg = new Node("wurzburg");
Node stuttgard = new Node("stuttgard");
Node kassel = new Node("kassel");
Node karlsruhe = new Node("karlsruhe");
Node erfurt = new Node("erfurt");
Node numberg = new Node("numberg");
Node augsburg = new Node("augsburg");
Node munchen = new Node("munchen");
Graph g = new Graph();
g.nodes.add(frankfurt);
g.nodes.add(mannheim);
g.nodes.add(wurzburg);
g.nodes.add(stuttgard);
g.nodes.add(kassel);
g.nodes.add(karlsruhe);
g.nodes.add(erfurt);
g.nodes.add(numberg);
g.nodes.add(augsburg);
g.nodes.add(munchen);
frankfurt.addAdjacentNode(mannheim);
frankfurt.addAdjacentNode(wurzburg);
frankfurt.addAdjacentNode(kassel);
mannheim.addAdjacentNode(karlsruhe);
karlsruhe.addAdjacentNode(augsburg);
augsburg.addAdjacentNode(munchen);
munchen.addAdjacentNode(kassel);
munchen.addAdjacentNode(numberg);
wurzburg.addAdjacentNode(erfurt);
wurzburg.addAdjacentNode(numberg);
numberg.addAdjacentNode(stuttgard);
g.breadthFirstTraversal(frankfurt);*/
}
}
这是我的输入文件:
01 02
02 01 03
03 02 04 05
04 03
05 03 06
06 05
这是我自己在 main 中编写的那段代码:
Scanner scan = new Scanner(new File("Connections.txt")); // scanner to read file
String line = scan.nextLine(); // read first line
int nbLine = Integer.parseInt(line); // get number of lines
ArrayList<int[]> al = new ArrayList<int[]>();
for(int i = 0; i < nbLine; i++) { // read each line
line = scan.nextLine();
String[] token = line.split(" "); // split each number into different String
int[] points = new int[token.length - 1]; // prepare array of int[] - 1
// int[] point = new int[];
int[] point;
for(int j = 0; j < token.length; j++){ // skip first one
points[j-1] = Integer.parseInt(token[j]); // store as int
al.add(points); // save in ArrayList
}
我走对了吗?
【问题讨论】:
-
输入文件是什么样的?到目前为止,您尝试了什么,遇到了哪些具体问题?实际行为与预期行为有何不同?
-
@JasonC 我更新了我的代码并添加了输入文件,以及我写的一段代码尝试它,但如上所述,一行有问题
-
更新!我摆脱了那个错误
标签: java text java.util.scanner