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

时间:2016-04-19 00:11:07

标签: java android arrays text-files streamreader

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

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

        }
    }

3 个答案:

答案 0 :(得分:2)

对于数组大小问题,我建议使用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;
     }
}

答案 1 :(得分:1)

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

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

编码时通常不会重新发明轮子,只需使用本机库及其功能即可完成您想要的操作。

至于空行,我假设当一个空白行发生时,String被填充为空,所以在这种情况下你只需要检查String是否为空,然后在这种情况下,以您认为合适的方式填充容器,或者下面的海报表明根本不会填充容器。

答案 2 :(得分: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];

将获取所需行的列。

value格式打印System.out.println(value);以下内容:

  

2

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

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);