将 String 数组转换为 Int 数组并求和
Convert String array to an Int array and total it
我需要创建一个接受文件输入的程序。我需要要求用户输入两 (2) 个变量,即贷款的利率和月份。然后我计算月供,输出文件中的原始输入以及贷款月数和月供。
我在将数组中的数字转换为整数以便计算它们时遇到问题。我已经尝试了几件事,但无法让它做我想做的事。在阅读了其他一些问题后,我能够找到如何将数组转换为 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();
}
}
}
}
您的输入由交替的数字和non-numeric数据组成。在用 split("\s+")
将空白行拆分后,您正在尝试将所有字符串放入 int
。这将不可避免地导致运行时 NumberFormatException
。
为避免这种情况,您需要向流中添加 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();
}
这基本上就是问题的答案:
Convert String array to an Int array and total it
要修复代码的其他部分,您必须清楚地了解您要实现的目标。这段代码中有很多操作打包在一起,您需要将其拆分为单独的方法,每个方法都有自己的职责。
写入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 个流,因为一行只能包含一个值,并且没有要用流处理的内容。
我需要创建一个接受文件输入的程序。我需要要求用户输入两 (2) 个变量,即贷款的利率和月份。然后我计算月供,输出文件中的原始输入以及贷款月数和月供。
我在将数组中的数字转换为整数以便计算它们时遇到问题。我已经尝试了几件事,但无法让它做我想做的事。在阅读了其他一些问题后,我能够找到如何将数组转换为 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();
}
}
}
}
您的输入由交替的数字和non-numeric数据组成。在用 split("\s+")
将空白行拆分后,您正在尝试将所有字符串放入 int
。这将不可避免地导致运行时 NumberFormatException
。
为避免这种情况,您需要向流中添加 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();
}
这基本上就是问题的答案:
Convert String array to an Int array and total it
要修复代码的其他部分,您必须清楚地了解您要实现的目标。这段代码中有很多操作打包在一起,您需要将其拆分为单独的方法,每个方法都有自己的职责。
写入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 个流,因为一行只能包含一个值,并且没有要用流处理的内容。