我正在尝试从文本文件中将值添加到二维数组中。我无法弄清楚如何将输入文件转换为教师的数组格式。该文件包含第一行,该第一行进入表示顶点的数组。那部分工作正常。第一行之后的每一行都包含邻接矩阵的数字。读入这些数字但由于某种原因矩阵中的槽未被填充。我需要使用这些数字来填充一个与使用此语句相同的双数组:
int[][] edges = {
{0,1}, {0,2},
{1,0},{1,2},
{2,0},{2,1},{2,3},{2,4},{2,6},
{3,2},{3,4},{3,5},
{4,2},{4,3},
{5,3},{5,6},
{6,2},{6,5},{6,7},
{7,6}
我必须从txt文件中读取输入。名称表示图表中节点或顶点的名称。数字表示邻接矩阵中顶点的位置。例如,第一行表示映射到节点john的行o,这意味着john通过边连接到节点1和2,它们是peter和mary。数字应该与上面的数组创建方式相同。这是文件的样子:
john;peter;mary;susan;george;debbie;tom;bill;
0 1 2
1 0 2
2 0 1 3 4 6
3 2 4 5
4 2 3
5 3 6
6 2 5 7
7 6
这是我的代码:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestSocialGraph {
public static void main(String args[]){
String verts;
int[][] edges;
int[] intPasser;
File input = new File("GraphInput.txt");
String[] names;
try {
Scanner reader = new Scanner(input);
verts = reader.next();
names = verts.split(";");
edges = new int[names.length][names.length];
while (reader.hasNextLine()){
int b = 0;
int count = 0;
String passer = reader.nextLine();
// System.out.println(passer);
String[] temp = passer.split(" ");
intPasser = new int[temp.length];
for(int i = 1; i< temp.length; i++){
System.out.println(temp[i]);
intPasser[b] = Integer.parseInt(temp[i]);
b++;
}
System.out.println(intPasser[0]);
for(int i = 0; i< intPasser.length; i++){
edges[count][intPasser[i]] = 1;
}
count++;
}
} catch (FileNotFoundException e) {
System.out.println("File not found. Please place appropriate file and restart program");
System.exit(1);
}
}
}
答案 0 :(得分:0)
您的代码中有很多要纠正的问题。
verts = reader.next();
应为verts = reader.nextLine();
。 edges
是 20 x 2 矩阵,而在您的代码中,它是 8 x 8 方阵。文件中的边数似乎不依赖于第一行中的名称数,那么为什么要实例化这样的边数组呢?b
没用,您可以在循环中将其替换为i
count
永远不会递增(或者至少从不使用递增的值),因为它在循环的每个转弯处重新初始化。 这就是为什么你永远不会填写某些行。答案 1 :(得分:0)
您的数据来自哪里?我会避免自己编写/维护解析器。这是浪费时间。你有没有想过使用JSON?您的数据(在Java代码版本中)看起来就像那样。
何时可以将数据转换为
{
"vertices" : ["john","peter","mary","susan","george","debbie","tom","bill"],
"edges" : [[0,1], [0,2], ...]
}
您可以使用标准JSON解析器读取文档模型并直接开始使用数据。
这是如何使用JSON数据的示例: http://www.mkyong.com/java/json-simple-example-read-and-write-json/
答案 2 :(得分:0)
看起来你正试图建立一个邻接矩阵......
即。文件中的第一行显示
0 1 2
因此,这意味着节点0连接到节点1&amp;节点2.它与你老师给出的内容相符:
{0,1},{0,2},
因此,在最后的2D数组 edge 中,它应该像这样表示(节点0所连接的索引中的1s):
edges [0] = {0,1,1,0,0,0,0,0};
Dici的回答在这个问题上是完全正确的 - 它是计数变量的位置,它正在产生问题。将int count = 0;
放在while循环之外,并使用readLine()而不是read(),您应该获得该数据的邻接矩阵表示。
唯一的问题是教师的代表性和你在这里尝试生产的那个是不同的。因此,后来处理这些输入的逻辑也会有所不同。一个程序将与您的老师提供的内容一起运行,但不会使用您创建的矩阵运行。
<强> --------------------------- EDIT ---------------- ----------- 强>
作为对IMO评论的回应,您需要两次检查文件 - 首先获取边数(在本例中为20),然后填充边数组与实际值。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestSocialGraph {
public static void main(String args[]) {
int[][] edges;
File input = new File("GraphInput.txt");
try {
Scanner reader = new Scanner(input);
reader.nextLine();// Skips the first line (nameList)
int count = 0;
// Count the total number of 2 element arrays
while (reader.hasNextLine()) {
String passer = reader.nextLine();
count += passer.split(" ").length - 1;
}
reader.close();
edges = new int[count][];
int i = 0;
reader = new Scanner(input);
reader.nextLine();// Skips the first line (nameList)
while (reader.hasNextLine()) {
String passer = reader.nextLine();
String[] split = passer.split(" ");
for (int j = 1; j < split.length; j++) {
edges[i + j - 1] = new int[2];
edges[i + j - 1][0] = Integer.parseInt(split[0]);
edges[i + j - 1][1] = Integer.parseInt(split[j]);
}
i += split.length - 1;
}
reader.close();
print(edges);
} catch (FileNotFoundException e) {
System.out.println(e);
}
}
private static void print(int[][] e) {
for (int i = 0; i < e.length; i++) {
for (int j = 0; j < e[i].length; j++)
System.out.print(e[i][j] + " ");
System.out.println();
}
}
}
我希望代码不会太模糊/不可读。