【问题标题】:Trying to insert text from file to 2D array. Java. Text is different formats尝试将文本从文件插入到二维数组。爪哇。文本是不同的格式
【发布时间】:2015-03-08 20:16:17
【问题描述】:

所以我有一个包含整数、双精度和字符串的文本文件,我需要将它们读入二维数组。数组应该有 6 列,但在您阅读整个文件之前,这些行是未知的。我猜它大约有 700 行这是我到目前为止所拥有的。如果我消除了数组,它会打印得很好,但是使用数组我会不断出错。 我已经搜索了很多这样的问题,但它们通常只适用于整数/双打。另外请不要推荐arrayList,因为我们的课程中没有教过。

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

public class TitanicApp {


    public static void main(String[] args) throws FileNotFoundException {
       String[][] array=null;
        int i=0, j=0;
        String fileLine;
        String s;
        Scanner scannerIn=null;
        BufferedReader inputStream=null;
        try{
            inputStream = new BufferedReader(new FileReader("titanic.txt"));
            scannerIn = new Scanner(inputStream);

            while ((fileLine = inputStream.readLine()) != null){
                for (j=0;j<6;j++){

                    array [i][j]=scannerIn.next();
                    System.out.println(array[i][j]);
                    i++;
                }
            }
        }
        catch (IOException ex){
            ex.printStackTrace();
        }
    }

文件中的示例文本:

1   1   Allen, Miss. Elisabeth Walton   female  29  211.3375
1   1   Allison, Master. Hudson Trevor  male    0.9167  151.5500

输出应该是:

[ [1,   1,  Allen, Miss. Elisabeth Walton,  female, 29, 211.3375]
  [1,   1,  Allison, Master. Hudson Trevor, male,   0.9167, 151.5500]
]

我有一个包含上述信息(以及更多行)的 txt 文件,我需要将其放入二维数组中。由于有限制,我不得不删除一半以上。

【问题讨论】:

  • 你遇到了什么错误?
  • 另外,你会得到一个 NullPointer 异常,因为“array”是空的。
  • 你有什么解决办法吗?
  • 执行类似的操作:String[][] array = new String[6][];
  • 现在我得到 java.lang.String 无法转换为 java.lang.String[][]

标签: java arrays bufferedreader


【解决方案1】:

所以你只想使用数组来做。您可以将以下示例视为参考 -

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TitanicApp {

    int size = 10;
    int colCount = 6;
    String[][] array = null;

    public static void main(String[] args) {
        TitanicApp app = new TitanicApp();
        app.startExec();
    }

    public void startExec() {

        array = new String[size][colCount];
        String fileLine;
        int i=0;

        try 
        {
            BufferedReader inputStream = new BufferedReader(new FileReader("C:/titanic.txt"));
            while ((fileLine = inputStream.readLine()) != null) {
                addTo2DArray(fileLine.split("\\t"), ++i);
            }
            inputStream.close();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }

        // Now you have the desired array : array;
    }

    public void addTo2DArray(String[] tmpArray, int minCapacity) {
        if((minCapacity > size)) {
            size = (size * 3)/2 + 1;
            String[][] newArray = new String[size][colCount];
            for(int i=0; i<array.length; i++) {
                for(int j=0; j<array[i].length; j++) {
                    newArray[i][j]=array[i][j];
                }
            }
            array = newArray;
        }
        array[minCapacity-1] = tmpArray;
    }
}

另一种解决方案:

String content = new Scanner(new File("/titanic.txt")).useDelimiter("\\Z").next();
String[] rows = content.split("\n");
String[][] finalArray = new String[rows.length][];
for(int i=0; i<rows.length; i++)
{
    finalArray[i] = rows[i].split("\\t");
}
//Your desired array is : finalArray;

【讨论】:

  • 我迷失在你的代码中。也许我的开始并不好。还有其他方法可以将我的样本等信息行转换为二维数组吗?
  • 发布您的 txt 文件并发布您想要的最终数组。
  • 非常感谢您的帮助。我在这里没有看到附加选项。我试图复制一些文本,但不清楚。它在我的原始帖子中。我需要存储的信息如下:3 0 Zimmerman, Mr. Leo male 29 7.8750
  • 我已经更新了你的问题。看看对不对。还有这六个字段是怎么分开的,TAB?
【解决方案2】:

从外观上看,您同时增加了两个数组位置(i 和 j)。如果您希望输入按数组顺序递增 j 直到 array.size 然后递增 i。一个例子是嵌套的 for 循环。

for(int i = 0; i < array.size; i++){
    for(int j = 0; j < array.size; j++){
        array[i][j] = scanner.next();
        System.out.println(array[i][j]);
    }
}

或者在你的情况下,停止增加值,直到 i 和 j 达到 6 而不是 array.size

【讨论】:

  • 这不是问题。
【解决方案3】:

我认为你需要为你的 String[][] 声明一个大小,否则你会得到一个 NullPointerException。据我所知,ArrayLists 是动态生成列表的唯一方法。

【讨论】:

  • 是的,这就是我得到的。我不知道大小。我能做什么?
  • 只需读取行数然后设置数组大小然后重置指针,但我认为您需要先标记指针。或者您可以再次将 inputStream 和scannerIn 变量重新分配给new。查看 BufferedReader 中的读取和重置方法。我自己也不太了解他们。请点赞我的帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多