使用 BufferedReader 将文件内容存储在 Integer 的 ArrayList 中
Storing contents of file in ArrayList of Integer using BufferedReader
我想存储以下格式的文本文件的内容:
第一行包含 2 个整数,例如 n 和 k,由白色分隔 space。
以下行包含 n 个整数(n 可以很大)(我想将其存储在 ArrayList 中)
通过在线搜索 Java 中处理文件的方式,我了解到 BufferedReader 是处理大输入的首选方式,因为它更快(与 Scanner 相比)以及如何做它。我的尝试如下:
public static void main(String[] args) throws IOException {
StringBuilder t = new StringBuilder();
try(BufferedReader br = Files.newBufferedReader(Paths.get("./interview1.txt"))) {
t.append(br.readLine());
String[] firstLine = new String[2];
firstLine = t.toString().split(" ");
int n = Integer.parseInt(firstLine[0]);
// System.out.println(n);
int k = Integer.parseInt(firstLine[1]);
// System.out.println(k);
String line;
List<Integer> list = new ArrayList<>(n);
while((line = br.readLine()) != null){
String[] thisLine = line.split(" ");
for(int i = 0; i < thisLine.length; i++){
// System.out.print(thisLine[i] + " ");
list.add(Integer.valueOf(thisLine[i]));
}
}
} catch (Exception e) {
System.err.format("IOException: %s%n", e);
}
因为我知道第一行只包含 2 个数字,所以我读取了该行,将其转换为大小为 2 的字符串数组,然后将 2 个整数分开。到目前为止一切都很好。
接下来问题来了,进入while循环之后。在尝试将内容添加到列表中时,我不断收到 java.lang.NumberFormatException(据我所知,这意味着我试图将不包含可解析 int 的字符串转换为整数)。
取消注释 for 循环中的第一行会导致以下输出:
3 4 2 1 6 7 1 2 2 3 (extra random 2 towards the end??)
当前使用的文件内容:
10 5
3 4 2 1 6 7 1 2 3
我做错了什么?
您似乎可以使用 java.nio
,所以我建议尽可能多地使用它的功能并去掉 BufferedReader
:
我的示例文件 numbers.txt 如下所示:
1 2 14 55 165
2
3 4 5 6 7
4
6
7 8 9 10 11 12 13 14 15 16 17
您可以阅读它并将数字存储在 List<List<Integer>>
中每一行的单独 List<Integer>
中,或者只将您在该文件中读取的所有数字存储在一个 List<Integer>
中。检查以下代码及其注释:
public static void main(String[] args) {
// provide the path to the file
Path pathToFile = Paths.get("Y:\our\path\to\numbers.txt");
// provide a list of lists of numbers
List<List<Integer>> numbersInLines = new ArrayList<>();
// or provide a single list of integers
List<Integer> allNumbers = new ArrayList<>();
// try reading the file, you may want to check if it exists and is valid before
try {
Files.lines(pathToFile).forEach(line -> {
// provide a list for the numbers of each line
List<Integer> realNumbers = new ArrayList<>();
// split the line by an arbitrary amount of whitespaces
String[] lineElements = line.trim().split("\s+");
// convert them to integers and store them in the list of integers
for (String lineElement : lineElements) {
// check if there is an empty String
if (!"".equals(lineElement)) {
// add it to the list of the current line
realNumbers.add(Integer.valueOf(lineElement));
// and / or add it to the list of all numbers
allNumbers.add(Integer.valueOf(lineElement));
}
}
// store the list of numbers of the current line in the list of lists
numbersInLines.add(realNumbers);
});
} catch (IOException e) {
e.printStackTrace();
}
// print each line list
numbersInLines.forEach(lineNumbers -> {
lineNumbers.forEach(System.out::print);
System.out.println();
});
// and / or print all the numbers in a single line, separated by a whitespace
allNumbers.forEach(number -> System.out.print(number + " "));
}
输出将是这样的:
121455165
2
34567
4
6
7891011121314151617
1 2 14 55 165 2 3 4 5 6 7 4 6 7 8 9 10 11 12 13 14 15 16 17
我想存储以下格式的文本文件的内容:
第一行包含 2 个整数,例如 n 和 k,由白色分隔 space。
以下行包含 n 个整数(n 可以很大)(我想将其存储在 ArrayList 中)
通过在线搜索 Java 中处理文件的方式,我了解到 BufferedReader 是处理大输入的首选方式,因为它更快(与 Scanner 相比)以及如何做它。我的尝试如下:
public static void main(String[] args) throws IOException {
StringBuilder t = new StringBuilder();
try(BufferedReader br = Files.newBufferedReader(Paths.get("./interview1.txt"))) {
t.append(br.readLine());
String[] firstLine = new String[2];
firstLine = t.toString().split(" ");
int n = Integer.parseInt(firstLine[0]);
// System.out.println(n);
int k = Integer.parseInt(firstLine[1]);
// System.out.println(k);
String line;
List<Integer> list = new ArrayList<>(n);
while((line = br.readLine()) != null){
String[] thisLine = line.split(" ");
for(int i = 0; i < thisLine.length; i++){
// System.out.print(thisLine[i] + " ");
list.add(Integer.valueOf(thisLine[i]));
}
}
} catch (Exception e) {
System.err.format("IOException: %s%n", e);
}
因为我知道第一行只包含 2 个数字,所以我读取了该行,将其转换为大小为 2 的字符串数组,然后将 2 个整数分开。到目前为止一切都很好。
接下来问题来了,进入while循环之后。在尝试将内容添加到列表中时,我不断收到 java.lang.NumberFormatException(据我所知,这意味着我试图将不包含可解析 int 的字符串转换为整数)。
取消注释 for 循环中的第一行会导致以下输出:
3 4 2 1 6 7 1 2 2 3 (extra random 2 towards the end??)
当前使用的文件内容:
10 5
3 4 2 1 6 7 1 2 3
我做错了什么?
您似乎可以使用 java.nio
,所以我建议尽可能多地使用它的功能并去掉 BufferedReader
:
我的示例文件 numbers.txt 如下所示:
1 2 14 55 165
2
3 4 5 6 7
4
6
7 8 9 10 11 12 13 14 15 16 17
您可以阅读它并将数字存储在 List<List<Integer>>
中每一行的单独 List<Integer>
中,或者只将您在该文件中读取的所有数字存储在一个 List<Integer>
中。检查以下代码及其注释:
public static void main(String[] args) {
// provide the path to the file
Path pathToFile = Paths.get("Y:\our\path\to\numbers.txt");
// provide a list of lists of numbers
List<List<Integer>> numbersInLines = new ArrayList<>();
// or provide a single list of integers
List<Integer> allNumbers = new ArrayList<>();
// try reading the file, you may want to check if it exists and is valid before
try {
Files.lines(pathToFile).forEach(line -> {
// provide a list for the numbers of each line
List<Integer> realNumbers = new ArrayList<>();
// split the line by an arbitrary amount of whitespaces
String[] lineElements = line.trim().split("\s+");
// convert them to integers and store them in the list of integers
for (String lineElement : lineElements) {
// check if there is an empty String
if (!"".equals(lineElement)) {
// add it to the list of the current line
realNumbers.add(Integer.valueOf(lineElement));
// and / or add it to the list of all numbers
allNumbers.add(Integer.valueOf(lineElement));
}
}
// store the list of numbers of the current line in the list of lists
numbersInLines.add(realNumbers);
});
} catch (IOException e) {
e.printStackTrace();
}
// print each line list
numbersInLines.forEach(lineNumbers -> {
lineNumbers.forEach(System.out::print);
System.out.println();
});
// and / or print all the numbers in a single line, separated by a whitespace
allNumbers.forEach(number -> System.out.print(number + " "));
}
输出将是这样的:
121455165
2
34567
4
6
7891011121314151617
1 2 14 55 165 2 3 4 5 6 7 4 6 7 8 9 10 11 12 13 14 15 16 17