You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Scanner类交替读取文件中男女生对应整数并统计求和

问题描述

我正在使用Scanner处理包含4个男生、3个女生信息的文件,文件中每条数据格式为「姓名 对应整数」,例如Mike 24,数据顺序固定为男生、女生交替排列。需要实现两个核心需求:

  • 分别统计男生、女生的总人数
  • 分别计算所有男生对应整数的总和、所有女生对应整数的总和

Scanner用法疑问

  1. 给boys变量赋值时调用的console.nextInt(),是否会直接读取文件中的整数并赋值给boys变量?
  2. 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();
          }
    }

  } 
}
解答

疑问解答

  1. 关于console.nextInt()的作用:是的,该方法会跳过所有默认分隔符(空格、换行等空白符),直接读取下一个整数类型的token并赋值给对应变量。但你现有代码的逻辑存在问题:每条数据是姓名在前、整数在后,所以会先读到字符串类型的姓名触发else分支直接跳过,之后才会读到整数,此时如果在if分支里连续调用两次nextInt(),会直接跳过性别顺序判断,导致计数和求和结果全部错误。
  2. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:06