将 String 数组转换为 Int 数组并合计

Convert String array to an Int array and total it

提问人:Josh 提问时间:3/1/2022 最后编辑:Alexander IvanchenkoJosh 更新时间:4/26/2022 访问量:178

问:

我需要创建一个接受文件输入的程序。我需要要求用户输入两 (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();
      }
    }   
  }
}
Java 数组 IO 输入 输出流

评论

1赞 Jim Garrison 3/1/2022
输入数据与贷款计算有何关系?请更正问题中的信息以匹配问题。

答:

1赞 Alexander Ivanchenko 3/1/2022 #1

您的输入由交替的数值和非数值数据组成。在将空格上的行拆分后,您将尝试将所有字符串转换为.这将不可避免地导致运行时。split("\\s+")intNumberFormatException

为了避免这种情况,您需要向流添加 a,以确保仅解析由数字组成的字符串。filter()

而且,由于您仅用作计算的第二个流的源,因此您应该摆脱冗余。无需创建第二个流并在内存中分配未使用的数组。int[] resultssum

另一个错误是变量的作用域仅限于循环。根据您的输入示例,一行最多只包含一位数字。这没有多大意义,我认为这不是你的本意。sumwhile

以下是解决这些问题的方法之一:

    int sum = 0;
    try(Stream<String> lines = Files.lines(inputFile.toPath())) {
        sum = getSum(lines);
    } catch (IOException e) {
        e.printStackTrace();
    }

请注意try-with-resources 是处理实现 .当区块执行完成(正常或突然)时,所有资源将被关闭。AutoCloseabletry

计算总和的逻辑:

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 数组并合计

要修复代码的其他部分,您必须清楚地了解要实现的目标。此代码中有很多操作打包在一起,您需要将其拆分为单独的方法,每个方法都有自己的责任。

写入 的代码似乎与计算总和的过程无关。基本上,您正在创建一个只有一行附加行的副本:.outputFileinputFile"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 流,因为一行只能包含一个值,并且不需要对流进行任何处理。