如何使数组大小取决于文本文件大小?

How to make array size dependent on text file size?

经过一些努力(我是新手),我设法创建了一个读取文本文件并将其放入多维数组的方法。然而,数组大小是硬编码的,它不能很好地处理空行,所以我有以下问题:

1) 如何定义我的数组等于文本文件的大小?

2) 有没有简单的方法来处理空行?理想情况下,我只想从文本文件中删除任何空白,以便数组不包含空值,但我愿意接受有关最佳处理方法的建议。

这是我目前的情况:

public void TextFileReader (){

        String[][] textFileData = new String[5][2];

        InputStreamReader InputSR = null;
        BufferedReader BufferedRdr = null;
        String thisLine = null;

        InputSR = new InputStreamReader(getResources().openRawResource(R.raw.text_file));
        BufferedRdr = new BufferedReader(InputSR);

        try {
            // open input stream text_file for reading purpose.
            int i = 0;
            while ((thisLine = BufferedRdr.readLine()) != null) {
                String[] parts = thisLine.split(" ");
                textFileData[i][0] = parts[0];
                textFileData[i][1] = parts[1];
                Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0]));
                Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1]));
                i = i +1;
            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

您需要使用数组有什么特别的原因吗?由于这个确切的原因,数组通常是不好的做法:它们具有静态大小,需要手动更改以避免溢出。实际上,除非有特定需要,否则几乎没有人使用数组。

更好的方法是查看其他动态更改其大小的容器,例如 Arraylist。您应该能够创建具有相同效果但不提供数组限制的 Arraylists 的 Arraylist。

编码时通常尽量不要重复发明轮子,只需使用本机库及其功能来完成您希望它们完成的工作。

至于空行,我假设当出现空行时,字符串被填充为空,所以在这种情况下,您只需要检查字符串是否为空,然后填充您的在这种情况下,以您认为合适的任何方式填充容器,或者正如下面的海报所建议的那样,根本不要填充容器。

对于数组大小问题,我建议使用 ArrayList,因为它是动态分配的,因此您不必确定大小,否则您将不得不计算文件中的行数和字数。 对于空白行,只需跳过它:

while ((thisLine = BufferedRdr.readLine()) != null) {
     if(!thisLine.trim().equals("")){
            String[] parts = thisLine.split(" ");
            textFileData[i][0] = parts[0];
            textFileData[i][1] = parts[1];
            Log.v("String Array"+i+"0", String.valueOf(textFileData[i][0]));
            Log.v("String Array"+i+"1", String.valueOf(textFileData[i][1]));
            i = i +1;
     }
}

正如我在评论中所说,在这种情况下使用 ArrayList 会使事情变得简单得多,因为您不必担心事先知道大小。你可以这样实现它:

ArrayList<String[]> arrayList = new ArrayList<>();
try {
    // open input stream text_file for reading purpose.
    while ((thisLine = BufferedRdr.readLine()) != null) {
        if (!thisLine.isEmpty()) {
            String[] parts = thisLine.split(" ");
            arrayList.add(parts);
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

注意我添加了以下条件:

if (!thisLine.isEmpty()) {

这使得空行被跳过并且不会添加到 ArrayList


您可以像遍历数组一样遍历 ArrayList 来查看它的内容:

for (String[] row : arrayList) {
    System.out.println(Arrays.toString(row));
}

或者像这样:

for (int i = 0; i < arrayList.size(); i++) {
    System.out.println(Arrays.toString(arrayList.get(i)));
}

我用以下数据制作了一个虚拟文件:

line one

line two

line three

注意每行之间的空行。打印 ArrayList 的内容导致:

[line, one]
[line, two]
[line, three]

如果你真的想使用双数组,你可以先遍历文件并计算你有多少非空行,就像你已经这样做了一样(加上 if (!thisLine.isEmpty()) {),然后像那样对数组进行维数。


编辑
使用 ArrayList,如果你想得到第 2 行,第 2 列,你可以这样做(记住数组从索引 0 开始):

String[] row = arrayList.get(1);

将抓取您想要的行

String value = row[1];

将抓取您想要的行的列。

System.out.println(value); 输出 value 输出:

two

或者您可以在一行中完成:

String value = arrayList.get(1)[1];

或者更好的是,你可以创建一个方法,这样你就可以随时调用它:

public static String getValue(ArrayList<String[]> arrayList, int row, int column) {
    return arrayList.get(row)[column];
}

你可以这样称呼:

String value = getValue(arrayList, 1, 1);