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
相关产品推荐
相关产品推荐

