feiyu02
2021-11-10 db7243622e8b5f4cc23de5594b2d973562f0b2a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.flightfeather.uav.dataprocess
 
/**
 * 均值计算工具,将一组连续数据转换为自定义周期的均值数据
 * 要求传入的数据按照时间顺序排列,
 * @param onTag 定义数据标签获取回调函数,当当前数据标签与上个数据标签不同时,即认为上一组数据为同一组数据,需求出均值
 * @param onAvg 定义均值计算方法
 */
class AverageUtil<T : Any>(var onTag: (d: T) -> String, var onAvg: (list: List<T>) -> T) {
 
    // 缓存最新的tag
    private var lastTag: String? = null
    // 临时数据缓存
    private val dataSet = mutableListOf<T>()
    // 转换结果
    private val result = mutableListOf<T>()
 
    /**
     * 将数据集转换为均值数据
     * @param list 原始数据
     * @return 均值数据
     */
    fun avg(list: List<T>): List<T> {
        // 初始化所有变量
        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()
    }
}