如何在Java中比较类对象的电池值,实现差值超1时的打印逻辑?
解决方案代码与说明
首先修正你现有代码中的语法错误,然后通过维护一个前次输入记录对象和首次输入标记,实现无内存浪费的相邻值比较逻辑,具体实现如下:
import java.util.Scanner; public class Out { Scanner sc = new Scanner(System.in); // 标记首次输入,避免初始默认值(0,0)干扰判断 private boolean isFirstInput = true; class In { // 内部类名首字母大写,符合Java命名规范 int x; int y; In(int x, int y) { this.x = x; this.y = y; } } In obj = new In(0, 0); public void func() { int battery = sc.nextInt(); int time = sc.nextInt(); In inner = new In(battery, time); // 跳过首次输入与默认值的无效比较 if (!isFirstInput) { // 计算相邻电池值的绝对差值 if (Math.abs(obj.x - inner.x) > 1) { System.out.println("前一次电池值:" + obj.x + ",对应时间:" + obj.y); } } else { isFirstInput = false; } // 更新记录为当前输入的对象,作为下一次比较基准 obj = inner; } }
核心逻辑说明
- 首次输入处理:通过
isFirstInput标记跳过初始默认值(0,0)与第一次用户输入的无效比较,避免误触发打印; - 差值判断:非首次输入时,计算前次记录电池值与当前输入电池值的绝对差值,若大于1则打印前次的电池值和对应时间;
- 内存控制:全程仅维护两个内部类对象(
obj和每次临时创建的inner),每次调用func()后inner会被自动回收,完全避免集合类带来的内存占用问题; - 语法修正:修复了原代码中
Scanner声明缺分号、内部类成员变量定义格式错误的问题,同时调整内部类名称为In(符合Java命名规范,避免与关键字混淆)。
示例测试验证
按照你给出的输入序列:
- 输入
98 2:首次输入,直接更新obj为(98,2),无输出; - 输入
97 4:差值为1,不触发打印,更新obj为(97,4); - 输入
95 9:差值为2>1,打印前一次电池值:97,对应时间:4,更新obj为(95,9); - 输入
94 11:差值为1,不触发打印,更新obj为(94,11)。
完全符合需求预期。
内容的提问来源于stack exchange,提问作者Anchal Dobriyal
相关产品推荐
相关产品推荐

