如何在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的作用及使用场景【说明】  如何在腾讯云服务器快速搭建个人网站?