【问题标题】:Counting coin flips from a file从文件中计算硬币翻转数
【发布时间】:2018-01-09 00:16:53
【问题描述】:

我要解决的问题来自Building Java Programs一书,格式如下:

编写一个名为 coinFlip 的方法,该方法接受一个扫描器,该扫描器表示一个硬币翻转的输入文件,该文件是正面 (H) 或尾部 (T)。将每一行视为一组单独的掷硬币,并输出该行中正面朝上的数量和百分比。如果超过 50%,则打印“You Win!”。

考虑以下文件:
H T H H T
T t t T h H

对于上面的输入,你的方法应该产生以下输出:

3 头 (60.0%)
你赢了!
2 头 (33.3%)

当我运行代码时,它只输出:“0 个头 (0.0)”。所以我假设由于某种原因它永远不会进入第二个 while 循环,或者我使用“next”方法错误。

import java.io.*;
import java.util.*;
public class CoinFlip {
    public static void main(String[] args) throws FileNotFoundException{
          Scanner input = new Scanner("Series1.txt");
          PrintStream output = new PrintStream("Output.txt");
          coinFlip(input, output);
    }
    public static void coinFlip(Scanner input, PrintStream output) {
        while(input.hasNextLine()) {
            Scanner linesc = new Scanner(input.nextLine());
            int headCount = 0;
            int totalNums = 0;
            while(linesc.hasNext()) {
                String letter = linesc.next();
                if(letter.equalsIgnoreCase("H")) {
                   headCount++;
                }
            totalNums++;
            }

            double percent = findPercentage(headCount, totalNums);
            output.println(headCount + " heads " + "(" + percent +")");
            if(percent > 50.00) {
                output.println("You win!");
            }

        }
    }
    public static double findPercentage(int num1, int num2 ) {
       double percentage = (double)num1/num2 * 100;
       return percentage;
    }
}

【问题讨论】:

  • 你需要调试你的程序来弄清楚到底发生了什么。不过这里有一个提示:不要使用== 来比较String 的值。请改用equals() 方法。
  • 我只是将其更改为 letter.equalsIgnoreCase("H") 但它仍然输出相同的输出
  • 那么请调试你的程序。程序的执行与您的预期有何不同?不要假设它永远不会进入第二个 while 循环。确认这是否属实,然后调查原因。
  • 按照建议,我尝试多次调试我的代码(手动调试,因为我还没有学习如何使用 Eclipse 调试器)并且我让同行评审了我的代码。他认为我的代码没有任何问题,并且从逻辑上讲它应该可以解决。但是,有一条警告说明:“资源泄漏:'linesc' 永远不会关闭”。这可能是问题吗?感谢您的帮助,我真的很感激。
  • 其他地方有很多资源可以帮助您使用 Eclipse 调试器

标签: java file io java.util.scanner


【解决方案1】:

1 - 它是equalsIgnoreCase - 你缺少s

if (letter.equalsIgnoreCase("H")) {

2 - 您不是从文件Series1.txt 中读取,而是在读取字符串“Series1.txt”。使用

Scanner input = new Scanner(new File("Series1.txt"));

正如已经建议的那样,调试应该会有所帮助。一个非常简单的替代方法:在测试其值之前添加 System.out.println(letter);...

【讨论】:

  • 理想情况下,文件应该从类加载器作为流读取
  • @cricket_007 可能,取决于文件所在的位置,是否为 JAR,其他条件(如从标准输入读取)
  • @PedroGonzalez,如果你想认真编程,你应该学会使用调试器......
  • 根据我的经验,new File 并不是超级可靠,至少在不同的 IDE 之间工作
  • @cricket_007 20 年的 Java,不能说它不可靠……更像是使用不同默认工作目录的 IDE(可通过设置更改)。 File 只是一个路径,好吧,在这种情况下只是文件名。
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2019-01-07
  • 2018-12-30
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多