查找list集合中,持续时间>=ContinueTime的数据集合,保存在新的list中

在给定的包含时间戳的list中,查找连续continueNum次的且时间间隔为needDiff的集合。
eg:相邻两个数据的时间戳间隔为1分钟,且超过30分钟有数据

bash 复制代码
	/**
     *
     * @param list 包含时间戳(10位)的list
     * @param continueNum  至少持续的数量
     * @param needDiff   相邻数据的间隔,单位:s
     * @return
     */
	public static List<List<TmpBean>> queryContinueList(List<TmpBean> list,int continueNum,long needDiff) {
        List<List<TmpBean>> result = new ArrayList<>();

        List<Long> timestamps = list.stream().map(x -> x.getPublishtime()).collect(Collectors.toList());
        list.sort((x1,x2)->x1.getPublishtime().compareTo(x2.getPublishtime()));

        if (timestamps.size() < continueNum) {
            return null; 
        }

        timestamps.sort(Long::compareTo); // 按照时间戳升序排序
        List<List<Long>> hisList = new ArrayList<>();
        long startTime = timestamps.get(0);
        for (int i = 1; i < timestamps.size(); i++) {
            long trueTime = startTime + needDiff * i;
            long realTime = timestamps.get(i);
            if (trueTime == realTime) {
                continue;
            } else {
                List<TmpBean> delBeans = new ArrayList<>(list.subList(0, i + 1));
                result.add(delBeans);
                list.removeAll(delBeans);

                List<Long> delTimes = new ArrayList<>(timestamps.subList(0, i + 1));//左闭右开
                hisList.add(delTimes);
                timestamps.removeAll(delTimes);
                int nowSize = timestamps.size();
                if (nowSize < continueNum) {
                    List<TmpBean> delLastBean = new ArrayList<>(list.subList(0,nowSize));
                    result.add(delLastBean);
                    break;
                } else {
                    startTime = timestamps.get(0);
                }
                i = 0;
            }
        }
        List<List<TmpBean>> lists = result.stream().filter(lis -> lis.size() >= continueNum).collect(Collectors.toList());
        return lists;
    }

	public static void main(String[] args) {
		//调用此方法,可以找到list中所有相邻时间为60s且连续次数>=30的目标list
        queryContinueList(list,30,60);
    }
相关推荐
lojox7 小时前
C++ 手写 STL list(双向循环链表)原理剖析与实现
c++·链表·list
longlongzihan4 天前
C++ 常用数据结构速查:vector、stack、queue、list、树、图、哈希表等声明与核心操作
数据结构·c++·list
xiangyun615 天前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
xiangyun616 天前
C++ list 模拟实现(一):手撕双向链表,从节点到迭代器
数据库·c++·算法·链表·stl·list
无忧.芙桃8 天前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
大鹏说大话9 天前
C++ STL 容器怎么选?vector、list、map、unordered_map 对比
开发语言·c++·list
by2099911 天前
list:迭代器与资源管理实现的综合叙述(下)
数据结构·c++·笔记·list
by2099913 天前
list 的使用:把节点、位置和操作联系起来的综合叙述(上)
数据结构·c++·笔记·list
ShineWinsu16 天前
对于Redis:List类型的解析
数据库·c++·redis·链表·缓存·面试·list
weixin1997010801618 天前
《1688物流API接口边界:logistics.trace.get 与 freight.template.list 的隐藏约束》(附Python源码)
windows·python·list