【问题标题】:Java scanner class that counts my doubles and non-doubles计算我的双打和非双打的 Java 扫描器类
【发布时间】:2017-08-29 09:24:36
【问题描述】:

我有一个问题,要求我从文件中读取标记并打印出三个值:数字标记的数量(双精度)、非数字标记的数量以及数字的总和.以及那些价值观。

我已经设法读取了文本文件,并且能够根据它们是否为双精度来将它们分开,但是我在构建我的输出时遇到了麻烦,目前它只是列表,除了非-doubles 在我的文本文件所在的位置列出:

    1 2 3 one two three
    z 1.1 zz 2.2 zzz 3.3 zzzz

我的代码看起来像:

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


     public class Lab1 {

        public static void main(String[] args) {

     Scanner in = null;

     try {
         in = new Scanner(new File("data.txt"));
     } catch (FileNotFoundException e) {
         System.err.println("failed to open data.txt");
         System.exit(1);
     }

    /**
     * parse file token by token
     */

     while (in.hasNext()) {
         String token = in.next();
    // if it's a Double
         try {
             double d = Double.parseDouble(token);
             System.out.println(+d);
             continue;
     } 
         catch (NumberFormatException e) {

         // It's not a double:

             System.out.println("Not a double");

     }
   }
}

    }

这是我的输出:

    1.0
    2.0
    3.0
    Not a double
    Not a double
    Not a double
    Not a double
    1.1
    Not a double
    2.2
    Not a double
    3.3
    Not a double

当我希望我的输出是这样的:

    6 7 12.6

分别对应双打数、非双打数和双打总和。

如果我的措辞有误,请原谅。只是想修复我的输出。

提前致谢!

【问题讨论】:

  • 您能否澄清一下您遇到的阻碍您获得所需输出的问题?看起来您需要使用 3 个变量来跟踪 2 个计数和运行总和。
  • 老实说,我只是对开始解析文件后该怎么做感到困惑。我想过将 int 用于双打数,将 int 用于非双打数,将 double 用于双打总和。我不知道如何构建这个想法。

标签: java double java.util.scanner


【解决方案1】:

你需要

  1. main 函数的顶部定义变量以记住当前的双打计数, 非双打,以及双打的总和。

    int doubles = 0;
    int nonDoubles = 0;
    double sumOfDoubles = 0.0;
    
  2. 每次从文件中读取时都添加到双精度/非双精度/总和

    while (in.hasNext()) {
        String token = in.next();
        try {
            // try to convert string to double
            double d = Double.parseDouble(token);
            doubles += 1;
            sumOfDoubles += d;
        } catch (NumberFormatException e) {
            // conversion failed - it's not a double
            nonDoubles += 1;
        }
    }
    
  3. 打印总计数main 函数的末尾。请注意,%.1f 会截断到小数点后一位。

    System.out.printf("%d %d %.1f", doubles, nonDoubles, sumOfDoubles);
    

【讨论】:

  • 这正是我想要的,非常感谢。
【解决方案2】:

由于您已经设法检测到输入何时是双精度数和何时不是双精度数,您可以简单地在满足每种情况时分别增加计数器,并在读取完输入后显示输出。例如:

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


 public class Lab1 {

    public static void main(String[] args) {

      Scanner in = null;

      try {
        in = new Scanner(new File("data.txt"));
      } catch (FileNotFoundException e) {
        System.err.println("failed to open data.txt");
        System.exit(1);
      }

   /**
    * parse file token by token
    */

     // Added lines of code
     int noOfDoubles = 0;
     int noOfNonDoubles = 0;

      while (in.hasNext()) {
        String token = in.next();
        // if it's a Double
        try {
          double d = Double.parseDouble(token);
          System.out.println(+d);
          noOfDoubles++;
          continue;
        } 
         catch (NumberFormatException e) {

         // It's not a double:

           System.out.println("Not a double");
           noOfNonDoubles++;

         }
      }

     System.out.println("No of doubles: " + noOfDoubles + ", " +
         "No of non-doubles: " + noOfNonDoubles);
   }

}

至于计算存在的双精度数的总和,您可以按照布鲁斯在他的回答中建议的方式进行操作,即以与上述计数器类似的方式添加另一个计数器来计算总和。但是,由于以下问题,您可能需要考虑使用 BigDecimal:Java: Adding and subtracting doubles are giving strange results

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多