目录
[2、集合内500条数据,每个数据对象List 值,List[i]与List[i]相加求均值](#2、集合内500条数据,每个数据对象List 值,List[i]与List[i]相加求均值)
方法
场景题
1、集合内的数据累加
java
// 遍历源数据计算总和
// 初始化计算参数
int dataCount = drivingList.size();
double validValueSum = 0.0;
double totalPowerSum = 0.0;
for (SetDriving driving : drivingList) {
// 1. 计算有效值和总功率的总和
if (driving.getValidValue() != null) {
validValueSum += driving.getValidValue();
}
if (driving.getTotalPower() != null) {
totalPowerSum += driving.getTotalPower();
}
// 设置平均值(处理空数据情况,避免0.0不合理,建议用null)
Double validValue = calculateAverage(validValueSum, dataCount);
Double totalPower = calculateAverage(totalPowerSum, dataCount);
2、集合内500条数据,每个数据对象List<folat> 值,List[i]与List[i]相加求均值
java
// 频谱(假设固定长度为500)
List<Float> avgFftBufList = new ArrayList<>(Collections.nCopies(500, 0.0f));
// 记录每个索引的有效数据条数(用于处理部分数据长度不足的情况)
int[] fftCount = new int[500];
List<Float> fftBufList = setDrivingProto.getFftBufList();
// 累加频谱数据(确保列表长度为500,避免数组越界)
for (int i = 0; i < Math.min(fftBufList.size(), 500); i++) {
//替换list,i位[avgFftBufList第i位值+fftBufList第i位值]
avgFftBufList.set(i, avgFftBufList.get(i) + fftBufList.get(i));
// 记录该索引的有效数据条数
fftCount[i]++;
}
// 计算频谱和PSD的平均值(处理有效数据条数为0的情况)
for (int i = 0; i < 500; i++) {
if (fftCount[i] > 0) {
avgFftBufList.set(i, avgFftBufList.get(i) / avgFftBufList.size());
}
}
java
// 初始化计算参数
int dataCount = drivingList.size();
double validValueSum = 0.0;
double totalPowerSum = 0.0;
// 频谱和PSD的平均值列表(假设固定长度为500,与源数据一致)
List<Float> avgFftBufList = new ArrayList<>(Collections.nCopies(500, 0.0f));
List<Float> avgPsdBufList = new ArrayList<>(Collections.nCopies(500, 0.0f));
// 记录每个索引的有效数据条数(用于处理部分数据长度不足的情况)
int[] fftCount = new int[500];
int[] psdCount = new int[500];
// 遍历源数据计算总和
for (SetDriving driving : drivingList) {
// 1. 计算有效值和总功率的总和
if (driving.getValidValue() != null) {
validValueSum += driving.getValidValue();
}
if (driving.getTotalPower() != null) {
totalPowerSum += driving.getTotalPower();
}
// 2. 处理文件路径中的频谱和PSD数据
String filePath = driving.getFilePath();
if (filePath != null && !filePath.isEmpty()) {
InputStream inputStream = null;
try {
// 从MinIO获取文件流
inputStream = minioUtil.downFileStream(filePath, "das");
if (inputStream == null) {
log.error("文件流为空,路径:{}", filePath);
return;
}
// 解析文件数据
DrivingProto.Driving drivingDataObject = SectionDataParseUtil.getDrivingDataObject(inputStream);
List<Float> fftBufList = drivingDataObject.getFftBufList();
List<Float> psdBufList = drivingDataObject.getPsdBufList();
// 累加频谱数据(确保列表长度为500,避免数组越界)
for (int i = 0; i < Math.min(fftBufList.size(), 500); i++) {
avgFftBufList.set(i, avgFftBufList.get(i) + fftBufList.get(i));
// 记录该索引的有效数据条数
fftCount[i]++;
}
// 累加PSD数据
for (int i = 0; i < Math.min(psdBufList.size(), 500); i++) {
avgPsdBufList.set(i, avgPsdBufList.get(i) + psdBufList.get(i));
psdCount[i]++;
}
} catch (Exception e) {
log.error("解析文件失败,路径:{}", filePath, e);
} finally {
// 强制关闭流,避免资源泄漏
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
log.error("关闭文件流失败", e);
}
}
}
}
}
// 计算频谱和PSD的平均值(处理有效数据条数为0的情况)
for (int i = 0; i < 500; i++) {
if (fftCount[i] > 0) {
avgFftBufList.set(i, avgFftBufList.get(i) / avgFftBufList.size());
}
if (psdCount[i] > 0) {
avgPsdBufList.set(i, avgPsdBufList.get(i) / avgPsdBufList.size());
}
}
// 设置平均值(处理空数据情况,避免0.0不合理,建议用null)
Double validValue = calculateAverage(validValueSum, dataCount);
Double totalPower = calculateAverage(totalPowerSum, dataCount);
}
/**
* 抽取计算平均值的方法
*
* @param sum
* @param count
* @return
*/
private Double calculateAverage(double sum, int count) {
return count > 0 ? sum / count : null;
}
