Java 如何将元素存储在二维数组中并打印(从文件读取)

Java 如何将元素存储在二维数组中并打印(从文件读取),java,Java,好的,这是我的代码。你们可能会用faceplam做出反应,但在经历了很多困惑之后,这就是我现在想到的,请纠正我所有的错误(我知道我在编程方面很糟糕!) Scanner in=null; 试一试{ in=新扫描仪(新文件阅读器(“C:\\Documents and Settings\\UserXP\\My Documents\\src\\file.txt”); }捕获(FileNotFoundException e1){ //TODO自动生成的捕捉块 e1.printStackTrace(); }

好的,这是我的代码。你们可能会用faceplam做出反应,但在经历了很多困惑之后,这就是我现在想到的,请纠正我所有的错误(我知道我在编程方面很糟糕!)

Scanner in=null;
试一试{
in=新扫描仪(新文件阅读器(“C:\\Documents and Settings\\UserXP\\My Documents\\src\\file.txt”);
}捕获(FileNotFoundException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
字符串行=”;
ArrayList=新的ArrayList();
而((line=in.nextLine())!=null){
arrayList.add(行);
系统输出打印项次(行);
}
字符[][]数组=新字符[2337][];

对于(int row=0;row简单地说,您正在读取一行,并假设它至少包含34个字符。您正在读取的文件可能不是这种情况

这是给您带来问题的一行:

array[row][col] = ss.charAt(col);
为什么您会认为
ss
至少包含34个字符?您可以随时添加检查:

String ss = in.nextLine();
if (ss.length() < array[row].length) {
    // Handle this however you want, e.g. throwing a contextually-useful
    // exception or skipping the line
}
String ss=in.nextLine();
if(ss.length()
这里是另一个版本的代码,可以帮助您获取数据并将其分配给阵列

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class ReadFileTo2DArray {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Scanner in;
        char array[][]=new char[2337][];
        try {
        in = new Scanner(new FileReader("C:\\Documents and Settings\\UserXP\\My Documents\\src\\file.txt"));

            String line="";
            int lineNuumber=0;
            while(in.hasNext() && (line=in.nextLine())!=null){
                array[lineNuumber]=new char[line.length()];
                for (int i = 0; i < line.length(); i++) {
                    array[lineNuumber][i]=line.charAt(i);
                    System.out.print(""+array[lineNuumber][i]);
                }

              System.out.println("");
              lineNuumber++;
            }

            System.out.println("total number of lines:"+lineNuumber);
            in.close();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }




    }

}
import java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.util.Scanner;
公共类ReadFileTo2DArray{
/**
*@param args
*/
公共静态void main(字符串[]args){
扫描仪输入;
字符数组[][]=新字符[2337][];
试一试{
in=新扫描仪(新文件阅读器(“C:\\Documents and Settings\\UserXP\\My Documents\\src\\file.txt”);
字符串行=”;
int linenumber=0;
while(in.hasNext()&&(line=in.nextLine())!=null){
数组[LineNuNumber]=新字符[line.length()];
对于(int i=0;i
只有一件事: -如果文件中有2337行或更少行,它可以正常工作。如果有更多行,您将得到一个异常。因为您使用2337初始化了数组,这意味着您没有空间存储更多行

希望这能解决你的问题


祝您好运

您正在迭代数组的长度,但从可能较短的字符串中读取字符

例如:

ss
为字符串
“test”
col
为5(根据您的代码
col
可以有0到33之间的任何值)。如果您想从
“test”
中获取第6个字符(索引5),您将看到一个问题:字符串只有4个字符


因此,在行的长度上循环(直到数组的长度,在这里使用
Math.max()
)或者,一旦索引超出范围,就中断内部循环。

问题在于从文件中读取的字符串长度。如果字符串长度小于列数,代码将失败。

其他人提到了如何处理文件中的每一行的问题。但除了您所拥有的代码中的另一个问题。如果文件包含的行数少于2337行,则最终将得到一个NPE(因为您的外部循环)。您需要检查读取行是否为空,如果为真,则中断循环。

很明显,ss字符串在某些情况下少于34个字符。实际上,您初始化的方式不太好。相反,您可以将值动态添加到数组中。否则,在不需要如此大的数组的情况下,您仍然可以迎合记忆


对于检查,您可以使用ss.lenght()而不是数组大小

如果您确实需要将文件中的字符写入2d数组,那么我会这样做

int counter =0;
char[][] array = new char[2000][34];
char c ="";
while((c = ss.charAt(counter++))!=null){
        array[counter%2000][counter/2000]=c;
        if(counter/2000 => 34-1) //then not enought space
计数器将从您的字符(1,…,n)中运行。 计数器/2000将分解行,计数器%34将分解列

eg字符(36)将存储在数组[36][0]中。 字符(3023)将存储在数组[1023][1]中


也许while循环中有语法错误,但这个想法会奏效;)。

iv只显示了我代码中出现错误的相关部分,如果您能告诉我这个错误的含义,或者告诉我可能是什么错误…(我对编程很陌生)哪一行发生了错误?^(完成了这个,iv得到:)线程“main”java.lang.NullPointerException at read_file.main(read_file.java:121)中的异常如何删除此错误,我阅读需要整个文件我更新了代码并添加if(ss!=null),因为该文件似乎不包含2337行。您仍然有错误吗?向我们展示您阅读文件的代码IV编辑了我的原始代码,请参见此处
int counter =0;
char[][] array = new char[2000][34];
char c ="";
while((c = ss.charAt(counter++))!=null){
        array[counter%2000][counter/2000]=c;
        if(counter/2000 => 34-1) //then not enought space