【问题标题】:Find out the min, max, total of an input text file and write it into a new output text file?找出输入文本文件的最小值、最大值和总数并将其写入新的输出文本文件?
【发布时间】:2018-10-27 07:03:01
【问题描述】:
package file_handling;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Scanner;

public class WriteToFile {
public static void main(String[] args) {

      int currentNumber, sum = 0, numberCount=0;
      FileReader infile; 

      Scanner input = new Scanner(System.in);
      File file2 = new File("D:/test1.txt");
      input = new Scanner(file2);
        int min;
        int max;
      while (input.hasNextInt()){
        currentNumber = input.nextInt();
        sum+=currentNumber;

        numberCount++;
        if(currentNumber < min) {
            min= currentNumber;
        }
        if(currentNumber > max) {
            max = currentNumber; 
        }
      }

      System.out.println("Min: " + min);

      System.out.println("Max: " + max);

      System.out.println("Total: " + sum);

    File file1 = new File("D:/test.txt");
    try {
        PrintWriter output = new PrintWriter(file1);
        output.write(max, min, sum);
        output.close(); //don't forget this method 
    } catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }

}

}

输入.txt:

9.22

11.55

-2.21

16.95

22.11

-5.11

根据 input.txt 的内容,我正在尝试编写一个程序来找出最大数、最小数和这些数的总和,并将结果写入一个名为 output.txt 的文件中。

输出.txt:

Min:

Max:

Total:

我必须使用 Scanner 类来读取文件并使用 PrintWriter 类来写出文件。

我不确定我做错了什么,有人可以帮助我吗?

我在第 44 行收到此错误:output.write(max, min, sum);
线程“main”java.lang.Error 中的异常:未解决的编译问题: PrintWriter 类型中的 write(char[], int, int) 方法不适用于参数 (int, int, int)

在 file_handling.WriteToFile.main(WriteToFile.java:44)

【问题讨论】:

  • 你能解释一下什么不起作用吗?
  • 请看我的编辑
  • 没有PrintWriter 的方法可以接收(int, int, int)。最小值、最大值和总和的值也正确吗?看起来您的 while 循环正在被跳过。

标签: java file printwriter


【解决方案1】:

有几个问题:

  1. 您的代码将无法编译,因为没有 PrintWriter 的方法 接受(int, int, int)。您可以使用该方法 write(String s) 达到同样的效果。

    output.write(String.valueOf("Min: " + min + "\n\nMax: " + max + "\n\nTotal : " + sum));
    
  2. 文件作为字节序列读取,因此您需要使用 input.hasNextLine() 阅读每一行。使用您当前的代码,不会执行您的 while 循环。接下来,您将需要 将每个 String 转换为 Double。所以你的while循环需要 调整如下:

    while (input.hasNextLine()) {
        String currLine = input.nextLine(); 
    
        // check for empty spaces
        if (currLine != null && currLine.trim().length() > 0) {
            currentNumber = Double.parseDouble(currLine); 
    
            // same from here
            sum += currentNumber;
            numberCount++;
            if (currentNumber < min) {
                min = currentNumber;
            }
            if (currentNumber > max) {
                max = currentNumber;
            }       
        }
    }
    
  3. 您不能使用 int 来存储双精度值。所以声明你所有的 int 双倍的。 (也不确定为什么要使用numberCount,可以去掉。)

    double currentNumber, sum = 0, numberCount = 0, min = 0, max = 0;
    

【讨论】:

    【解决方案2】:

    使用 printf 代替 write:

    output.printf("Max:  %d\n", max);
    output.printf("Min:  %d\n", min);
    output.printf("Total:  %d\n", sum);
    

    【讨论】:

      【解决方案3】:

      如果您可以使用 Java 8 或 Java 9,您可以编写更短更简单的代码:

        public static void main(String[] args) throws IOException {
          DoubleSummaryStatistics statistics = Files
            .lines(new File("./test1.txt").toPath())
            .filter(l -> !l.isEmpty())
            .mapToDouble(Double::parseDouble)
            .summaryStatistics();
      
          double min = statistics.getMin();
          System.out.println("Min: " + min);
          double max = statistics.getMax();
          System.out.println("Max: " + max);
          double sum = statistics.getSum();
          System.out.println("Total: " + sum);
      
          Files.write(new File("./test2.txt").toPath(), List.of(Double.toString(min), Double.toString(max), Double.toString(sum)));
        }
      

      nio-API 定义了处理文件的类和方法,这些文件还处理文件(资源)的closing

      Stream-API 具有处理元素的类和方法。要计算双精度流 (DoubleStream) 的总和、最大值和最小值,我们可以使用方法 DoubleStream.summaryStatistics()

      如果您不能使用 Java 9,请使用 Arrays.asList() 而不是 List.of()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 2016-07-13
        • 2021-07-18
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多