将 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 个流,因为一行只能包含一个值,并且没有要用流处理的内容。