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