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

时间:2015-01-31 00:16:40

标签: java eclipse matrix readfile


我试图读取一个带有数字的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 个答案:

答案 0 :(得分:1)

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

虽然我想知道如果你可以使用Stringchar[][] matrix,或者在他们来时保存这些行并将单个字符提取为{{1在输出循环中。

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

line.charAt(i)

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

lines[j].charAt(i)

不会初始化 String s = in.readLine(); int largo = s.length(); // s is not used after this 的最后一列,该列仍然填充while ((line=in.readLine() ) != null){ ... 秒。对于那种最少侵入性的修复,就像在所有其他环境中一样处理循环中的第一行,如

matrix

3)我认为没问题。

4)处理数组维度的方式有点奇怪。您似乎是从文件中读取它们,但稍后它们会被硬编码。如果您的代码只能使用16x16矩阵,为什么还要使用null,如果它适用于其他大小的矩阵,为什么其他地方的16个大小的硬编码?

答案 1 :(得分:0)

  

2.-打印完成后,底部有一个空值。为什么呢?

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

  

3.-可以在while循环之外定义变量j吗?还是应该在里面?

外出并重复使用并不好。最好在里面宣布它。

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

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