如何使用Java Scanner类交替读取文件中男女生对应整数并统计求和
问题描述
我正在使用Scanner处理包含4个男生、3个女生信息的文件,文件中每条数据格式为「姓名 对应整数」,例如Mike 24,数据顺序固定为男生、女生交替排列。需要实现两个核心需求:
- 分别统计男生、女生的总人数
- 分别计算所有男生对应整数的总和、所有女生对应整数的总和
Scanner用法疑问
- 给boys变量赋值时调用的
console.nextInt(),是否会直接读取文件中的整数并赋值给boys变量? console.hasNext()是否带有索引属性,比如读取到第1个token时,我能否通过console.hasNext() == 1;的写法做判断?
样例数据
Erik 3 Rita 7 Tanner 14 Jillyn 13 Curtis 4 Stefanie 12 Ben 6
现有代码
import java.util.*; import java.io.*; public class Lecture07 { public static void main(String[] args) throws FileNotFoundException{ System.out.println(); System.out.println("Hello, world!"); // 练习: // 将你对问题1的答案写在此处:你需要在main()方法上方新增对应方法,再在此处调用 Scanner console = new Scanner(new File("mydata.txt")); boyGirl(console); } public static void boyGirl(Scanner console) { int boysCount = 0; int girlsCount = 0; while (console.hasNext()) { if (console.hasNextInt()) { int boys = console.nextInt(); int girls = console.nextInt(); } else { console.next(); } } } }
解答
疑问解答
- 关于
console.nextInt()的作用:是的,该方法会跳过所有默认分隔符(空格、换行等空白符),直接读取下一个整数类型的token并赋值给对应变量。但你现有代码的逻辑存在问题:每条数据是姓名在前、整数在后,所以会先读到字符串类型的姓名触发else分支直接跳过,之后才会读到整数,此时如果在if分支里连续调用两次nextInt(),会直接跳过性别顺序判断,导致计数和求和结果全部错误。 - 关于
console.hasNext()的索引属性:hasNext()返回的是布尔值,仅用来判断是否还有未读取的token,不存在任何索引属性,console.hasNext() == 1这种写法完全不成立,你需要自行新增变量记录当前读取的位置序号,判断当前属于男生位还是女生位。
功能实现修正代码
你可以新增一个位置标记变量,按照「男生姓名→男生整数→女生姓名→女生整数」的交替顺序处理token,直接完成计数和求和:
import java.util.*; import java.io.*; public class Lecture07 { public static void boyGirl(Scanner console) { int boysCount = 0; int girlsCount = 0; int boysSum = 0; int girlsSum = 0; // 标记当前处理的组别,偶数位为男生组,奇数位为女生组 int position = 0; while (console.hasNext()) { // 先读取姓名直接跳过 console.next(); // 再读取对应整数 int num = console.nextInt(); if (position % 2 == 0) { // 偶数位为男生 boysCount++; boysSum += num; } else { // 奇数位为女生 girlsCount++; girlsSum += num; } position++; } // 输出结果可按需调整格式 System.out.println("男生人数:" + boysCount + ",男生分数总和:" + boysSum); System.out.println("女生人数:" + girlsCount + ",女生分数总和:" + girlsSum); } public static void main(String[] args) throws FileNotFoundException{ System.out.println(); System.out.println("Hello, world!"); Scanner console = new Scanner(new File("mydata.txt")); boyGirl(console); } }
样例运行结果
使用提供的样例数据运行后输出如下:
男生人数:4,男生分数总和:27 女生人数:3,女生分数总和:32
结果和实际数据完全匹配:男生为Erik(3)、Tanner(14)、Curtis(4)、Ben(6),总和3+14+4+6=27;女生为Rita(7)、Jillyn(13)、Stefanie(12),总和7+13+12=32。
内容的提问来源于stack exchange,提问作者Micah Cave
相关产品推荐
相关产品推荐

