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