读取带有数字的 txt 文件并将其保存在字符串矩阵中

reading txt file with numbers and saving in it in a String Matrix


我试图读取一个包含数字的 txt 文件并将每个数字保存在一个字符串矩阵中,但有些事情我没有得到。
1.-如果我 运行 Eclipse 中的代码我打印了 16 次所有内容并且数字越来越小..
2.-打印后底部有一个空值。为什么?
3.-在 while 循环外定义变量 j 可以吗?还是应该在里面?

感谢您的帮助!

到目前为止我写了这个: 文本文件包含以下内容:

0000000000000000
0000000000000000
0000000400000000
0001111111160000
0001115111110000
0001161121510000
0001111511110000
0001110001110000
0000011311000000
0000011111000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000

和程序:

package Tests;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;

public class Test2 {

    public static void main(String [] args){

        try {
        File fil = new File("/Users/MaxRuizTagle/Desktop/AbschlussprojektWiSe1415/Canberra Fox - The Key Huntress/lvl/level0.txt");
        FileReader inputFil = new FileReader(fil);
        BufferedReader in = new BufferedReader(inputFil);

        String s = in.readLine();

        int largo = s.length();

        String [][] matrix = new String [largo][largo];

        String line;

        int j=0;

        while ((line=in.readLine() ) != null){
            for (int i=0;i<16;i++){
                matrix[i][j] = line.substring(i);   
            }
            j++;
        }

        for(int i=0;i<16;i++){
            for( j=0;j<16;j++){
                System.out.println(matrix[i][j]+" ");
            }
            System.out.println("");
        }


        }catch (IOException e1){
            e1.printStackTrace();

        }

    }

}

2.-After beeing printed there is a null value on the bottom . why?

因为第一行没有放在矩阵中,所以您只将它用于 s.length()。 然后 while 循环将只使用剩下的 15 行,而不是 16 行。 因此,最后一个 j 索引将具有 null 个值。

3.-Is it ok that the variable j is beeing defined outside the while loop? or should it be inside?

在外面重用也不好。最好声明在里面。

也许您正在寻找更像这样的东西:

    for (int j = 0; j < 16; j++) {
        matrix[0][j] = String.valueOf(s.charAt(j));
    }
    for (int i = 1; (line = in.readLine()) != null; ++i) {
        for (int j = 0; j < 16; j++) {
            matrix[i][j] = String.valueOf(line.charAt(j));
        }
    }

    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++) {
            System.out.print(matrix[i][j] + " ");
        }
        System.out.println("");
    }

1)打印16个数字的原因是你在这里打印16个数字:

    for(int i=0;i<16;i++){
        for( j=0;j<16;j++){
            System.out.println(matrix[i][j]+" "); // <-- each one a line.
        }
        System.out.println("");
    }

它们变短的原因是您之前在此处保存了越来越短的子字符串:

    for (int i=0;i<16;i++){
        matrix[i][j] = line.substring(i); // <-- substring from pos i to end
    }

你的要求不是很清楚,我只能猜测一下;在我看来,您似乎想做的是每个提取一个字符的字符串:

    for (int i=0;i<16;i++){
        matrix[i][j] = line.substring(i, i + 1); // substring from i to i + 1
    }

然后打印一行中的每一列(转置图像):

    for(int i=0;i<16;i++){
        for( j=0;j<16;j++){
            System.out.print(matrix[i][j]+" "); // print instead of println
        }
        System.out.println("");
    }

虽然我想知道如果您可以使用 char[][] matrixline.charAt(i) 或者保存行并将单个字符提取为 String =20=] 在输出循环中。

2) 你丢弃了开头的一行:

    String s = in.readLine(); 

    int largo = s.length();

    // s is not used after this

因此,您的矩阵从 16x16 缩小到 15x16,循环

while ((line=in.readLine() ) != null){
  ...

不会初始化 matrix 的最后一列,其中仍然填充有 null。最小侵入性的修复方法是,像对待所有其他行一样对待循环中的第一行,如

String line = s;

while(line != null) {
  ...

  line = in.readLine();
}

3) 我认为这没有问题。

4) 你处理数组维度的方式有点奇怪。您似乎是从文件中读取它们,但后来它们被硬编码了。如果您的代码只适用于 16x16 矩阵,为什么还要费心 largo,如果它应该适用于其他大小的矩阵,为什么 16 的大小在其他地方都被硬编码了?