2017-08-29 84 views
3

我有一个问题,我被要求从文件中读取标记并打印出三个值:标记的数量是数字(双打),标记的数量那不是数字,而是数字的总和。和那些价值。Java扫描器类,计数我的双打和非双打

我已经设法读取文本文件,并已能够根据它们是否双打将它们分开,但是我在构建我的输出时遇到了困难,目前它只是列表,除了非双打被列为这样在我的文本文件是:

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 

它们分别对应于双打双打的数量,非双打的数量和金额。

如果我的措辞不对,请原谅。只是想解决我的输出。

在此先感谢!

+0

你能否澄清一下你所困扰的问题,使你无法得到你想要的结果?看起来您需要使用3个变量来跟踪2个计数和运行总和。 – 4castle

+0

老实说,我只是对开始解析文件后该怎么做感到困惑。我考虑过使用int来表示双打数,int表示非双打数,double表示双打总数的双倍。我不知道如何构建这个想法。 – RasecCesar

回答

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); 
    
+0

这正是我所寻找的非常感谢你。 – RasecCesar

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