提问人:Josh 提问时间:3/1/2022 最后编辑:Alexander IvanchenkoJosh 更新时间:4/26/2022 访问量:178
将 String 数组转换为 Int 数组并合计
Convert String array to an Int array and total it
问:
我需要创建一个接受文件输入的程序。我需要要求用户输入两 (2) 个变量,利率和贷款月份。然后,我计算每月还款额,从文件中输出原始输入以及贷款月数和每月还款额。
我在将数组中的数字转换为 int 以便计算它们时遇到问题。我已经尝试了一些事情,但无法让它做我想做的事。在阅读了其他一些问题后,我能够找到如何将数组转换为 int 并获得总和,因此我将其包含在代码中。我知道在将“item”数组转换为 int 后如何进行计算。我只是在寻求将 item[1] 转换为可用于计算项目总和的数组的帮助。我在代码中包含了注释,可以更好地显示我正在寻找的内容。
这是输入文件的样子:
Driver 425
Putter 200
Wedges 450
Hybrid 175
这是我的代码:
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.*;
public class Assignment3t {
public static void main(String[] args) {
File inputFile = new File("Project3.txt");
File outputFile = new File("Project3Output.txt");
Scanner scanner = new Scanner(System.in);
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
System.out.print("Enter the interest rate: ");
float interestRate = scanner.nextFloat();
System.out.print("Enter months for the loan: ");
int loanMonths = scanner.nextInt();
try {
bufferedReader = new BufferedReader(new FileReader(inputFile));
bufferedWriter = new BufferedWriter(new FileWriter(outputFile));
String line;
while ((line = bufferedReader.readLine()) !=null) {
String[] item = line.split("\\s+");//create an array. This is the part I cant figure out. It creates the array, but I cant figure out how to get this data to "results" below.
int[] results = Stream.of(item).mapToInt(Integer::parseInt).toArray(); //converts the string array to an int array.
int sum = Arrays.stream(results).sum(); //calculates the sum of the array after its converted to an int to use in the monthly payment calculation.
bufferedWriter.write(line);
bufferedWriter.newLine();
}
bufferedWriter.write("Number of months of the loan: " + String.valueOf(loanMonths));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
答:
您的输入由交替的数值和非数值数据组成。在将空格上的行拆分后,您将尝试将所有字符串转换为.这将不可避免地导致运行时。split("\\s+")
int
NumberFormatException
为了避免这种情况,您需要向流添加 a,以确保仅解析由数字组成的字符串。filter()
而且,由于您仅用作计算的第二个流的源,因此您应该摆脱冗余。无需创建第二个流并在内存中分配未使用的数组。int[] results
sum
另一个错误是变量的作用域仅限于循环。根据您的输入示例,一行最多只包含一位数字。这没有多大意义,我认为这不是你的本意。sum
while
以下是解决这些问题的方法之一:
int sum = 0;
try(Stream<String> lines = Files.lines(inputFile.toPath())) {
sum = getSum(lines);
} catch (IOException e) {
e.printStackTrace();
}
请注意,try-with-resources 是处理实现 .当区块执行完成(正常或突然)时,所有资源将被关闭。AutoCloseable
try
计算总和的逻辑:
public static int getSum(Stream<String> lines) {
return lines.flatMap(line -> Stream.of(line.split("\\s+")))
.filter(str -> str.matches("\\d+"))
.mapToInt(Integer::parseInt)
.sum();
}
这基本上是问题的答案:
将 String 数组转换为 Int 数组并合计
要修复代码的其他部分,您必须清楚地了解要实现的目标。此代码中有很多操作打包在一起,您需要将其拆分为单独的方法,每个方法都有自己的责任。
写入 的代码似乎与计算总和的过程无关。基本上,您正在创建一个只有一行附加行的副本:.outputFile
inputFile
"Number of months of the loan: " + String.valueOf(loanMonths)
如果您坚持必须同时执行这些操作,例如,可能很大,那么它可能像这样完成:inputFile
try(BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
if (!line.isBlank()) {
sum += Integer.parseInt(line.split("\\s+")[1]);
}
}
writer.write("Number of months of the loan: " + String.valueOf(loanMonths));
} catch (IOException e) {
e.printStackTrace();
}
请注意,在这种情况下,不需要 Java 8 流,因为一行只能包含一个值,并且不需要对流进行任何处理。
评论