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