You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Songrui ef1519a49e 宋瑞-202506050301 3 weeks ago
..
ReadMe.md 宋瑞-202506050301 3 weeks ago
SensorDataCleaner.java 宋瑞-202506050301 3 months ago

ReadMe.md

AI 交互记录 - Java 传感器数据清洗处理器

任务背景

开发一个传感器数据清洗程序,遍历原始数据数组,过滤异常值并计算有效数据的平均值。


需求分析

核心功能

  1. 数据遍历:处理传感器原始数据数组
  2. 异常过滤:识别并处理三种数据类型
    • 致命错误(999):立即终止处理
    • 有效数据(1-100):累加统计
    • 越界数据(0、负数、>100):跳过并警告
  3. 结果计算:统计有效数据个数、总和、平均值
  4. 流程控制:使用 breakcontinue 控制循环

技术要求

  • 使用增强 for 循环遍历数组
  • 掌握 breakcontinue 的区别
  • 处理整数除法精度问题
  • 清晰的日志输出

开发过程

第1轮:基础结构搭建

用户需求:
创建主方法,定义传感器数据数组和统计变量

AI 实现:

void main() {
    int[] sensorData = {85, -5, 92, 0, 105, 999, 88, 76};
    int sum = 0;
    int count = 0;
    
    IO.println("=== 传感器数据清洗开始 ===");
}

设计说明:

  • 使用 void main()(Java 21+ 预览特性)
  • 初始化统计数据数组
  • sumcount 用于后续计算

第2轮:致命错误处理

用户需求:
当检测到 999 时立即终止整个循环

AI 实现:

for (int data : sensorData) {
    // 情况 1: 检查是否为致命错误 (999 代表传感器硬件断开)
    if (data == 999) {
        IO.println("致命错误:传感器掉线,终止处理");
        break;  // 立即终止整个循环
    }
    // ... 其他逻辑
}

关键点:

  • break 跳出整个循环
  • 模拟传感器硬件故障场景
  • 后续数据不再处理

第3轮:有效数据判断

用户需求:
筛选出 1-100 范围内的有效数据并累加

AI 实现:

// 情况 2: 检查数据是否在正常范围内 (1 到 100 之间)
if (data >= 1 && data <= 100) {
    sum += data;
    count++;
    IO.println("数据 [" + data + "] 有效,已计入总和");
}

逻辑说明:

  • 范围判断:data >= 1 && data <= 100
  • 累加到 sum
  • 计数器 count 自增
  • 输出确认信息

第4轮:越界数据处理

用户需求:
处理无效数据(0、负数、>100),跳过但不终止

AI 实现:

// 情况 3: 数据无效 (0、负数,或大于 100 但不是 999)
else {
    IO.println("警告:发现越界数据 [" + data + "],已跳过");
    // continue 可省略,因为这是最后一个分支
}

break vs continue 对比:

关键字 作用 应用场景
break 终止整个循环 遇到 999 致命错误
continue 跳过当前迭代 遇到越界数据(可选)

第5轮:结果计算与输出

用户需求:
根据有效数据统计结果,计算平均值

AI 实现:

IO.println("=== 传感器数据清洗结束 ===");

if (count > 0) {
    // 有有效数据,计算平均值
    double average = (double) sum / count;
    IO.println("有效数据个数:" + count);
    IO.println("有效数据总和:" + sum);
    System.out.printf("有效数据平均值:%.2f%n", average);
} else {
    // 没有任何有效数据
    IO.println("无有效数据");
}

技术要点:

  • 强制类型转换(double) sum 避免整数除法
  • 精度保留%.2f 保留两位小数
  • 空数据保护count > 0 防止除以零

执行流程演示

输入数据

int[] sensorData = {85, -5, 92, 0, 105, 999, 88, 76};

逐行处理过程

步骤 数据 判断结果 操作 sum count
1 85 有效 (1-100) 累加 85 1
2 -5 越界 (<1) 跳过 85 1
3 92 有效 (1-100) 累加 177 2
4 0 越界 (=0) 跳过 177 2
5 105 越界 (>100) 跳过 177 2
6 999 致命错误 break 终止 177 2
- 88 未处理 - - -
- 76 未处理 - - -

最终输出

=== 传感器数据清洗开始 ===
数据 [85] 有效,已计入总和
警告:发现越界数据 [-5],已跳过
数据 [92] 有效,已计入总和
警告:发现越界数据 [0],已跳过
警告:发现越界数据 [105],已跳过
致命错误:传感器掉线,终止处理
=== 传感器数据清洗结束 ===
有效数据个数:2
有效数据总和:177
有效数据平均值:88.50

核心技术要点

1. 增强 for 循环

for (int data : sensorData) {
    // 自动遍历数组每个元素
}

优势:

  • 代码简洁,无需索引
  • 避免越界错误
  • 适合只读遍历

2. break 与 continue 的区别

break 示例(本程序):

if (data == 999) {
    break;  // 遇到 999 立即停止,88 和 76 不会被处理
}

如果使用 continue:

if (data == 999) {
    continue;  // 跳过 999,继续处理 88 和 76
}

实际效果对比:

场景 break continue
遇到 999 终止循环 跳过当前项
后续数据 (88, 76) 不处理 继续处理
适用场景 致命错误 单项异常

3. 整数除法陷阱

错误写法:

double average = sum / count;  // 177 / 2 = 88(丢失小数)

正确写法:

double average = (double) sum / count;  // 177.0 / 2 = 88.5

原理:

  • int / int 结果仍是 int
  • 需将其中一个操作数转为 double

4. 防御性编程

空数据保护:

if (count > 0) {
    double average = (double) sum / count;
    // ... 输出结果
} else {
    IO.println("无有效数据");
}

避免的问题:

  • 除以零异常
  • 无意义的计算

测试用例

测试1:正常数据

int[] sensorData = {50, 60, 70};

输出:

有效数据个数:3
有效数据总和:180
有效数据平均值:60.00

测试2:包含致命错误

int[] sensorData = {50, 999, 70};

输出:

数据 [50] 有效,已计入总和
致命错误:传感器掉线,终止处理
有效数据个数:1
有效数据总和:50
有效数据平均值:50.00

测试3:全无效数据

int[] sensorData = {-5, 0, 105, 999};

输出:

警告:发现越界数据 [-5],已跳过
警告:发现越界数据 [0],已跳过
警告:发现越界数据 [105],已跳过
致命错误:传感器掉线,终止处理
无有效数据

测试4:边界值测试

int[] sensorData = {1, 100, 0, 101};

输出:

数据 [1] 有效,已计入总和    ← 边界值(最小)
数据 [100] 有效,已计入总和  ← 边界值(最大)
警告:发现越界数据 [0],已跳过
警告:发现越界数据 [101],已跳过
有效数据个数:2
有效数据总和:101
有效数据平均值:50.50

常见问题与解答

Q1:为什么用 void main() 而不是 public static void main(String[] args)

A:

  • void main() 是 Java 21+ 的预览特性(简化版)
  • 传统写法更兼容:
public static void main(String[] args) {
    // 原有代码
}

Q2:continue 在 else 分支中是否必要?

A: 不必要,因为 else 是最后一个分支,会自动进入下一次循环。但添加注释有助于理解意图:

else {
    IO.println("警告:发现越界数据 [" + data + "],已跳过");
    // continue 可省略
}

Q3:如果希望 999 也跳过而非终止,如何修改?

A:break 改为 continue

if (data == 999) {
    IO.println("警告:传感器异常读数,已跳过");
    continue;  // 继续处理后续数据
}

可扩展方向

  1. 动态输入:从文件读取传感器数据
  2. 统计增强:最大值、最小值、标准差
  3. 多传感器:二维数组处理多个传感器
  4. 异常分级:警告、错误、致命三级分类
  5. 数据修复:用平均值填充缺失数据

总结

代码特性

  • ✓ 三种数据类型处理(有效、越界、致命)
  • break 立即终止循环
  • ✓ 整数除法精度处理
  • ✓ 空数据保护
  • ✓ 清晰的日志输出

技术栈

  • 增强 for 循环
  • 条件判断(if-else)
  • 流程控制(break/continue)
  • 类型转换(int → double)
  • 格式化输出(printf)

学习要点

  1. 理解 breakcontinue 的执行差异
  2. 掌握整数除法的精度陷阱
  3. 学会防御性编程(空值检查)
  4. 熟悉增强 for 循环的使用场景

完成时间: 2026年5月28日
项目路径: D:\Project\java\w2\SensorDataCleaner.java
代码行数: 54 行