Java扫描器类,计算我的双打和非双打

时间:2017-08-29 00:02:06

标签: java double java.util.scanner

我遇到一个问题,我被要求从文件中读取令牌并打印出三个值:作为数字的令牌数量(双打),不是数字的令牌数量,以及数字的总和。而且只是那些价值观。

我设法读取了文本文件,并且能够根据它们是否双倍来分离它们,但是我在构建输出时遇到了麻烦,目前只是列表,除了那个非双打在我的文本文件中列出:

    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

分别对应双打次数,非双打次数和双打次数。

如果我说错了请原谅。只是想修复我的输出。

提前致谢!

2 个答案:

答案 0 :(得分:1)

你需要

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

    int doubles = 0;
    int nonDoubles = 0;
    double sumOfDoubles = 0.0;
    
  2. 每次从文件中读取时,
  3. 添加到double / non-double / sum

    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;
        }
    }
    
  4. main功能结尾处打印总计数。请注意,%.1f会截断到一个小数位。

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

答案 1 :(得分:1)

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

 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