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

Java数组无法动态扩容处理文件输入,需支持任意数量输入

解决动态输入数量的问题

嘿,这问题我熟!要让代码能处理任意数量的输入,核心就是把固定大小的数组换成动态集合,Java里ArrayList就是干这个的,我给你一步步拆解怎么改:

1. 替换固定数组为ArrayList

把原来的固定长度数组声明:

RecordNewRun[] runners = new RecordNewRun[5]; // runner array

改成动态的ArrayList:

import java.util.ArrayList;
import java.util.List;

// 声明一个可以自动扩容的集合
List<RecordNewRun> runners = new ArrayList<>();

这样就不用提前指定大小了,不管文件里有多少个跑步者的数据,都能装得下。

2. 修改元素添加逻辑

原来你可能是用循环给数组下标赋值,比如:

runners[i] = new RecordNewRun(...);

现在换成ArrayList的add()方法,直接把新创建的RecordNewRun对象加进去就行:

// 每次读取完一个跑步者的信息,就添加到集合里
runners.add(new RecordNewRun(...));

3. 适配文件读取的循环逻辑

原来你可能是写死了循环5次,现在要改成直到文件读取完毕的循环。比如用Scanner读取文件的话:

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

public class YourRunnerClass {
    public static void main(String[] args) throws FileNotFoundException {
        List<RecordNewRun> runners = new ArrayList<>();
        Scanner scanner = new Scanner(new File("your-input-file.txt"));

        // 只要文件还有内容,就继续读取
        while (scanner.hasNext()) {
            // 这里根据你的输入格式,逐个读取字段
            // 比如输入里的第一个数字是跑步次数:
            int numRuns = scanner.nextInt();
            // 注意:如果名字有空格(比如Jane Mary O'Brien),next()会拆分单词,这时候需要用nextLine()配合处理
            String fullName = scanner.nextLine().trim(); // 或者分多次读取再拼接
            int birthYear = scanner.nextInt();
            int birthMonth = scanner.nextInt();
            int birthDay = scanner.nextInt();
            String gender = scanner.next();
            int parkId = scanner.nextInt();
            String parkName = scanner.nextLine().trim();

            // 然后读取对应的跑步记录(numRuns条)
            List<Double> runTimes = new ArrayList<>();
            for (int j = 0; j < numRuns; j++) {
                scanner.next(); // 跳过公园名称(因为和前面的重复?根据你的输入格式调整)
                runTimes.add(scanner.nextDouble());
            }

            // 创建RecordNewRun对象,加入集合
            RecordNewRun runner = new RecordNewRun(numRuns, fullName, birthYear, birthMonth, birthDay, gender, parkId, parkName, runTimes);
            runners.add(runner);
        }

        scanner.close();

        // 现在可以遍历集合处理所有跑步者的数据了
        for (RecordNewRun runner : runners) {
            // 处理逻辑,比如打印信息
            System.out.println(runner.getFullName());
        }
    }
}

几个关键注意点

  • 确保RecordNewRun类有匹配的构造方法,能接收你读取的所有字段(比如名字、生日、跑步记录列表等)。
  • 如果遇到带空格的字符串(比如全名、公园名),scanner.next()会以空格为分隔符,这时候要改用scanner.nextLine(),或者先读取整行再拆分内容。
  • 后续遍历集合时,用增强for循环for (RecordNewRun runner : runners)更方便,或者用runners.size()获取元素个数(代替数组的length属性)。

这样改完之后,不管文件里有1个还是100个跑步者的数据,代码都能轻松处理啦!

内容的提问来源于stack exchange,提问作者Maks Drzezdzon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:14:55