
本文介绍一种轻量级、无额外集合存储的方案,通过保存上一次输入的对象状态,在每次调用函数时实时比较当前与前一次的电池值差,若绝对差大于1,则输出前一次的电池值和对应时间,适用于高频调用(如上千次)且内存敏感的场景。
在实际开发中,当需要对连续输入的数据进行“变化阈值检测”(例如电池电量骤降),又受限于内存或性能(不能使用 ArrayList 等动态集合缓存全部历史记录)时,最高效的方式是仅维护上一个有效状态,实现“边读取、边比较、边更新”的流式处理逻辑。
根据你的需求,核心目标是:
✅ 每次调用 func() 读入一组 (battery, time);
✅ 与上一次成功创建的对象的 battery 值作差(取绝对值);
✅ 若 |current.battery - previous.battery| > 1,则立即打印上一次的 battery 和 time;
✅ 随后将当前对象设为新的 previous,继续下一轮。
以下是完整、可运行的优化代码(已修正原代码中的语法错误,并增强健壮性):
import java.util.Scanner;
public class Out {
private Scanner sc = new Scanner(System.in);
// 内部类:建议改为 static 或提升为顶层类(避免隐式外部类引用)
// 此处保留 inner class 形式,但需注意:非 static inner class 实例会持有外部类引用
class In { // 类名首字母大写,符合 Java 命名规范(原 'in' 已重命名为 'In')
int battery;
int time;
In(int battery, int time) {
this.battery = battery;
this.time = time;
}
}
private In previous = null; // 初始为 null,首次调用不触发比较
public void func() {
System.out.print("Enter battery level: ");
int battery = sc.nextInt();
System.out.print("Enter time (e.g., minutes): ");
int time = sc.nextInt();
In current = new In(battery, time);
// 首次调用跳过比较
if (previous != null) {
int diff = Math.abs(current.battery - previous.battery);
if (diff > 1) {
System.out.println("Alert: Battery drop > 1 detected — previous value: "
+ previous.battery + ", at time: " + previous.time);
}
}
// 更新 previous 为当前对象,供下一次比较
previous = current;
}
// 示例主流程(可循环调用 func 多次)
public static void main(String[] args) {
Out out = new Out();
// 模拟 4 次调用:(98,2) → (97,4) → (95,9) → (94,11)
// 预期输出:第3次调用时,检测到 |95−97|=2 > 1 → 打印 "97, 4"
for (int i = 0; i < 4; i++) {
out.func();
}
out.sc.close(); // 记得关闭 Scanner
}
}? 关键设计说明与注意事项:
- 零内存膨胀:全程只维护单个 In previous 引用,无论调用 10 次还是 10000 次,内存占用恒定;
- 绝对差判断:使用 Math.abs() 确保上升或下降超阈值均被捕捉(原题虽只提“greater than 1”,但实践中电量突增也可能异常);
- 命名与规范:修正了类名(In)、字段名(battery/time 更具语义)、移除了语法错误(如 int x, int y → int battery, int time);
- 空安全:首次调用 previous == null,跳过比较,避免 NPE;
- Scanner 资源管理:在 main 中显式调用 sc.close(),防止资源泄漏;
- 扩展建议:若后续需支持多条件(如同时监控 time 间隔、或支持自定义阈值),可将阈值 1 提取为成员变量或方法参数。
该方案完全契合你“不依赖 ArrayList、低内存、实时响应”的约束,是典型的状态机式流处理实践。
立即学习“Java免费学习笔记(深入)”;










