如何在Java中比较自定义类对象的字段值并检测相邻输入的电量突变
发布时间 - 2026-01-29 00:00:00 点击率:次本文介绍一种轻量级、无额外集合存储的方案,通过保存上一次输入的对象状态,在每次调用函数时实时比较当前与前一次的电池值差,若绝对差大于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 次还是 10
000 次,内存占用恒定;
- 绝对差判断:使用 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
# ai
# 内存占用
# NULL
# 成员变量
# math
# int
# 对象
# 首次
# 跳过
# 设为
# 适用于
# 自定义
# 历史记录
# 可将
# 更具
# 命名为
# 多条
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈redis在项目中的应用
微信小程序制作网站有哪些,微信小程序需要做网站吗?
JavaScript如何实现错误处理_try...catch如何捕获异常?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
EditPlus中的正则表达式实战(5)
如何获取免费开源的自助建站系统源码?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
详解jQuery中的事件
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
Laravel如何使用withoutEvents方法临时禁用模型事件
android nfc常用标签读取总结
如何在万网利用已有域名快速建站?
javascript日期怎么处理_如何格式化输出
Android仿QQ列表左滑删除操作
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
如何用低价快速搭建高质量网站?
深入理解Android中的xmlns:tools属性
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
Laravel如何生成API文档?(Swagger/OpenAPI教程)
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何用PHP快速搭建高效网站?分步指南
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel定时任务怎么设置_Laravel Crontab调度器配置
如何在建站主机中优化服务器配置?
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Android GridView 滑动条设置一直显示状态(推荐)
Python制作简易注册登录系统
Laravel怎么为数据库表字段添加索引以优化查询
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
北京网站制作的公司有哪些,北京白云观官方网站?
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
韩国服务器如何优化跨境访问实现高效连接?
Laravel怎么上传文件_Laravel图片上传及存储配置
敲碗10年!Mac系列传将迎来「触控与联网」双革新
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何在腾讯云服务器快速搭建个人网站?


