0

0

如何在Java中比较自定义类对象的字段值并检测相邻输入间的突变

聖光之護

聖光之護

发布时间:2026-01-30 10:24:20

|

373人浏览过

|

来源于php中文网

原创

如何在Java中比较自定义类对象的字段值并检测相邻输入间的突变

本文介绍一种轻量级、无额外集合开销的方案,通过保存上一次输入的对象状态,在每次调用 `func()` 时实时比较当前与前一次电池值的差值;若绝对差大于1,则输出前一次的电池值及对应时间。适用于高频调用(如上千次)且内存敏感的场景。

在实际开发中,我们常需对连续输入的数据进行增量式差异检测(delta detection),而非缓存全部历史数据。题中需求本质是:仅需维护“上一次”的状态,每次新输入到来时,与之比较并触发业务逻辑(如打印)。这完全无需 ArrayList 或其他集合——既节省内存,又提升性能。

✅ 正确实现思路

  1. 避免使用 obj = new in(0, 0) 作为初始占位符:因为 0 可能是合法输入值,导致首次比较失真。应引入布尔标志 hasPrevious 显式标识是否已有有效前序值。
  2. 比较逻辑必须使用 Math.abs():题目示例中“97 → 95”差值为 -2,绝对值 2 > 1,应触发打印。原答案中 obj1.x - obj2.x > 1 仅检测正向下降,遗漏反向跃升(如 95→98),必须修正为绝对差判断
  3. 封装比较逻辑为内聚方法:增强可读性与可维护性,但不必暴露为公共工具方法——它属于 Out 类的内部状态流转逻辑。

✅ 完整可运行代码(已修复语法、逻辑与健壮性)

import java.util.Scanner;

public class Out {
    private Scanner sc = new Scanner(System.in);

    // 内部类:封装电池电量(x)和时间戳(y)
    class In {  // 建议首字母大写:In 而非 in(符合Java命名规范)
        int x, y;
        In(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    // 状态变量:记录上一次有效输入
    private In previous = null;
    private boolean hasPrevious = false;

    public void func() {
        System.out.print("Enter battery level and time: ");
        int battery = sc.nextInt();
        int time = sc.nextInt();
        In current = new In(battery, time);

        // 若已有前一次值,且 |current.x - previous.x| > 1,则打印 previous
        if (hasPrevious && Math.abs(current.x - previous.x) > 1) {
            System.out.println("Jump detected: battery=" + previous.x + ", time=" + previous.y);
        }

        // 更新状态:current 成为下一轮的 previous
        previous = current;
        hasPrevious = true;
    }

    // 示例主流程(演示4次调用)
    public static void main(String[] args) {
        Out out = new Out();
        // 模拟输入:(98,2), (97,4), (95,9), (94,11)
        // 预期输出:97(因 |95−97|=2 > 1)
        for (int i = 0; i < 4; i++) {
            out.func();
        }
        out.sc.close(); // 避免资源泄漏
    }
}

⚠️ 关键注意事项

  • 命名规范:内部类名应为 In(PascalCase),而非 in(违反Java约定,易引发混淆);变量名 sc 可接受,但生产环境建议 scanner。
  • 空指针防护:使用 hasPrevious 标志替代 null 判定,语义更清晰;若强行用 previous == null,需确保 previous 初始化为 null(本例已满足)。
  • 输入安全:真实场景中应添加 sc.hasNextInt() 校验,防止 InputMismatchException。
  • 线程安全:本方案为单线程设计;若 func() 在多线程中并发调用,需加锁(如 synchronized)或改用原子引用。
  • 扩展性提示:如后续需支持多种阈值或多种字段比较(如同时监控 battery 和 time 的变化率),可将阈值抽为成员变量,并将比较逻辑提取为 private boolean isSignificantChange(In prev, In curr) 方法。

该方案以 O(1) 空间复杂度、O(1) 时间复杂度/次调用 完美满足题设“上千次调用、避免内存浪费”的核心约束,是状态机思想在数据流处理中的典型应用。

BGremover
BGremover

VanceAI推出的图片背景移除工具

下载

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

351

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

32

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

187

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

18

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

16

2026.01.21

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 53.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号