【问题标题】:Java counter issueJava 计数器问题
【发布时间】:2019-09-17 04:12:12
【问题描述】:

我正在尝试编写一个程序,该程序从文本文件中读取值并检查在特定值范围内有多少值。关键是最终让程序将每个范围的值总数打印到控制台。我已经有了它,它可以一次执行 1 个值,但随后它会随着每个新的 int 重置。在目前的情况下,它只会一遍又一遍地重复第一个数字。重申一下,我试图让它在对文本文件中的值进行排序后报告一个值在数字范围内的次数。

这是我的代码。

package lab2;

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

public class Lab2 {

    public static void main(String[] args) throws FileNotFoundException {

        File file = new File("lab2_input.txt");
        Scanner scan = new Scanner(file);

        int counter1 = 0;
        int counter2 = 0;
        int counter3 = 0;
        int counter4 = 0;
        int counter5 = 0;
        int counter6 = 0;
        int counter7 = 0;
        int counter8 = 0;

        while(scan.hasNextLine()) {

            int number = scan.nextInt();
            System.out.println(number);

            if (number <= 24){
                counter1++;
            }
            if (25 <= number && number <= 49){
                counter2++;
            }
            if (50 <= number && number <= 74){
                counter3++;
            }
            if (75 <= number && number <= 99){
                counter4++;
            }
            if (100 <= number && number <= 124){
                counter5++;
            }
            if (125 <= number && number <= 149){
                counter6++;
            }
            if (150 <= number && number <= 174){
                counter7++;
            }
            if (175<= number && number >= 200){
                counter8++;
            }

        }

        System.out.println(counter1);
        System.out.println(counter2);
        System.out.println(counter3);
        System.out.println(counter4);
        System.out.println(counter5);
        System.out.println(counter6);
        System.out.println(counter7);
        System.out.println(counter8);
    }

}

【问题讨论】:

  • 请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。喜欢:包括一些示例输入数据,并显示您获得的输出以及您的期望。

标签: java if-statement while-loop io counter


【解决方案1】:

我认为您的意思是检查例如从 25 到 49 的范围,而不是:

if (25 <= number && number <= 49){
    counter2++;
}

你应该写:

if (25 >= number && number <= 49){
    counter2++;
}

其他检查也是如此。

P.S.:我建议将 counter 设为数组并根据计算的索引递增元素,因为范围始终为 25:var index = number / 25

【讨论】:

  • 谢谢!这至少是我的问题的一部分。
  • @NickSims 没问题,如果有帮助,请考虑标记为正确
【解决方案2】:

这看起来像很多手动counter 保持;你想要的时间间隔定期在二十五点分开,所以我会使用一个数组。此外,使用try-with-Resources 以避免泄漏文件句柄。并使用Scanner.hasNextInt()Scanner.nextInt()(不是Scanner.hasNextLine())。最后,我将围绕计数及其范围添加更多描述性消息。喜欢,

File file = new File("lab2_input.txt");
int[] counters = new int[9];
try (Scanner scan = new Scanner(file)) {
    while (scan.hasNextInt()) {
        int v = scan.nextInt();
        if (v >= 0 && v <= 200) {
            counters[v / 25]++;
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}
for (int i = 0; i < counters.length; i++) {
    System.out.printf("The range %d to %d had %d values%n", i * 25, 
            ((i + 1) * 25) - 1, counters[i]);
}

【讨论】:

    【解决方案3】:

    您可以使用 else-if 块而不是多个 if 块并摆脱下限验证。如果您正在处理大量数字,这也会提高一些性能。

        if (number <= 24){
            counter1++;
        } else if (number <= 49){
            counter2++;
        } else if (number <= 74){
            counter3++;
        } else if (number <= 99){
            counter4++;
        } else if (number <= 124){
            counter5++;
        } else if (number <= 149){
            counter6++;
        } else if (number <= 174){
            counter7++;
        } else if (number <= 200){
            counter8++;
        }
    

    【讨论】:

    • 性能并不是真正的首要目标......它更多的是关于可读性。我同意这个级联读起来要好得多......但最大的问题是:通常你应该在 all 块周围放置大括号。然后 else if ... 变成 else { if { } } ... 并且所需的缩进导致可怕的嵌套深度。
    • @GhostCat 我认为这是您陈述中“通常”的例外,因为您给出的原因。如果任何常见的样式指南包含“在大括号中环绕 else if 块”要求并且实际上期望相反,我会感到惊讶。
    • @GhostCat 我知道在这种情况下,这不会显着提高性能。但我个人不同意你的说法,即可读性应该是第一个目标而不是性能。尽管可读性对于维护代码很重要,但不应因此而损害性能。因为应用程序代码的主要目标不是被阅读,而是被执行并有效地执行某些任务。
    • @GhostCat 尽管else if (condition) 提供与if (condition) { } else { if (another_condition) { }} 相同的行为,但它们在Java 中是两种不同的语法。所以不需要在上面的代码中引入额外的大括号或缩进。
    • 因为应用程序代码的主要目标不是被读取,而是被执行并有效地执行某些任务。 对于任何重要的代码,它都会被读取数百次。它只写一次。如果你过早地进行优化,你很快就会得到难以阅读和理解的代码。并且:将阻止您稍后进入并进行更改,例如提高性能。我同意,一个不应该忽视性能。但是,特别是在 java 中:性能很少来自在源代码中执行 X 或不执行 Y。
    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多