package com.flightfeather.uav.dataprocess
|
|
/**
|
* 均值计算工具,将一组连续数据转换为自定义周期的均值数据
|
* 要求传入的数据按照时间顺序正序排列,
|
* @param onTag 定义数据标签获取回调函数,当当前数据标签与上个数据标签不同时,即认为上一组数据为同一组数据,需求出均值
|
* @param onAvg 定义均值计算方法
|
*/
|
class AverageUtil<T, K>(var onTag: (d: T) -> String, var onAvg: (list: List<T>) -> K) {
|
|
// 缓存最新的tag
|
private var lastTag: String? = null
|
// 临时数据缓存
|
private val dataSet = mutableListOf<T>()
|
// 转换结果
|
private val result = mutableListOf<K>()
|
|
/**
|
* 将数据集转换为均值数据
|
* @param list 原始数据
|
* @return 均值数据
|
*/
|
fun avg(list: List<T>): List<K> {
|
// 初始化所有变量
|
clear()
|
// 计算均值
|
list.forEach {
|
val tag = onTag(it)
|
// 是第一条数据或tag相同时,将数据放入临时缓存列表
|
if (lastTag == null || tag == lastTag) {
|
dataSet.add(it)
|
}
|
// 当tag不同时,计算之前数据的均值,同时清空临时数据缓存,添加当前的新数据
|
else {
|
result.add(onAvg(dataSet))
|
dataSet.clear()
|
dataSet.add(it)
|
}
|
lastTag = tag
|
}
|
// 列表循环结束后,若缓存列表中仍有数据,则计算最后一个均值
|
if (dataSet.isNotEmpty()) {
|
result.add(onAvg(dataSet))
|
}
|
return result
|
}
|
|
private fun clear() {
|
lastTag = null
|
dataSet.clear()
|
result.clear()
|
}
|
}
|