Java计数器问题

时间:2019-09-17 04:12:12

标签: java counter

我正在尝试编写一个程序,该程序从文本文件中读取值并检查在特定值范围内有多少个值。关键是最终使程序将每个范围的值总数打印到控制台。我有一次它可以执行此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);
    }

}

3 个答案:

答案 0 :(得分:2)

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

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

您应该写:

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

其他检查也一样。

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

答案 1 :(得分:1)

看起来很多counter都是手动保存的;您所需的时间间隔通常以25为间隔,因此我将使用数组。另外,使用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]);
}

答案 2 :(得分:0)

您可以使用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++;
    }