
本文介绍如何在java中通过集合(如arraylist)持久化保存每次函数调用生成的内部类对象,并基于这些对象的字段(如battery)实现跨调用的差值判断与条件输出。
在实际开发中,若需在多次函数调用间保留状态并进行横向比较(例如检测相邻输入间的电量突变),仅依赖局部变量或单个对象是不够的——必须将每次创建的对象“积累”起来。你当前的代码中,func() 每次都会新建一个 in 实例,但该实例在方法结束时即被丢弃。解决的关键在于:使用外部可访问的集合容器统一存储所有历史对象。
首先,按 Java 命名规范重构代码:内部类应命名为 Inner(首字母大写),外层类 Out 也建议改为更具语义的名称(如 BatteryMonitor),此处为保持连贯性暂沿用,但强烈建议遵循标准。
以下是完整、可运行的改进方案:
import java.util.*;
public class Out {
private Scanner sc = new Scanner(System.in);
private List history = new ArrayList<>(); // ✅ 外部集合,持久保存所有对象
// ✅ 内部类名首字母大写,符合Java约定
class Inner {
int battery;
int time;
Inner(int battery, int time) {
this.battery = battery;
this.time = time;
}
}
public void func() {
System.out.print("Enter battery level and time: ");
int battery = sc.nextInt();
int time = sc.nextInt();
Inner obj = new Inner(battery, time);
history.add(obj); // ✅ 每次调用都存入历史列表
}
// ✅ 新增分析方法:检查相邻记录的电量差是否 > 1
public void analyzeAndPrint() {
if (history.size() < 2) {
System.out.println("Not enough data to compare.");
return;
}
System.out.println("Battery drops > 1 detected:");
for (int i = 0; i < history.size() - 1; i++) {
int diff = Math.abs(history.get(i).battery - history.get(i + 1).battery);
if (diff > 1) {
// 按题意:打印“前一次”的battery和time(即突变起点)
System.out.printf("Battery: %d, Time: %d%n",
history.get(i).battery,
history.get(i).time);
}
}
}
// 示例主流程:模拟4次调用
public static void main(String[] args) {
Out monitor = new Out();
// 模拟输入:98 2 / 97 4 / 95 9 / 94 11
// 注意:实际运行时需手动输入,或改用 Scanner(System.in) 配合重定向测试
for (int i = 0; i < 4; i++) {
monitor.func();
}
monitor.analyzeAndPrint();
}
} 关键要点说明:
- history 是类成员变量(非局部),生命周期贯穿整个 Out 实例,确保多次 func() 调用的数据不丢失;
- 使用 ArrayList
而非 LinkedList(除非频繁中间插入/删除),因随机访问更高效; - analyzeAndPrint() 封装了核心逻辑:遍历相邻元素,计算 |battery[i] - battery[i+1]| > 1,满足即输出 i 对应对象的完整信息;
- 示例输入序列 (98,2)→(97,4)→(95,9)→(94,11) 中,97→95 差值为 2 > 1,因此输出 Battery: 97, Time: 4,完全符合题目要求。
注意事项:
⚠️ 若需支持并发调用,history 应替换为线程安全集合(如 CopyOnWriteArrayList)并加同步控制;
⚠️ 生产环境中建议将 Scanner 关闭(sc.close()),并在 main 结束前调用;
⚠️ 更健壮的设计可引入 Builder 模式或独立数据类(record BatteryReading(int battery, int time),Java 14+),提升可读性与不可变性。
通过这种“收集→分析”的两阶段设计,你不仅能解决当前的差值判断需求,也为后续扩展(如统计最大降幅、时间窗口聚合等)奠定了清晰结构基础。










