从文本文件创建二维数组

时间:2014-10-12 07:17:50

标签: java arrays file-io

我正在尝试从文本文件中将值添加到二维数组中。我无法弄清楚如何将输入文件转换为教师的数组格式。该文件包含第一行,该第一行进入表示顶点的数组。那部分工作正常。第一行之后的每一行都包含邻接矩阵的数字。读入这些数字但由于某种原因矩阵中的槽未被填充。我需要使用这些数字来填充一个与使用此语句相同的双数组:

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);
    }
}
}

3 个答案:

答案 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();
        }
    }
}

我希望代码不会太模糊/不可读。