java 按照时间来统计 去除重复数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 按照时间来统计 去除重复数据相关的知识,希望对你有一定的参考价值。
设备上安装的app应用,用户点击一次就会调用我们的接口,记录下信息:用户id,打开应用起始时间,结束时间,app名称等等。这些信息会生成log文件,log每一行就是上面记录的信息。这些数据要通过分析之后转存到DB里,为了以后可以在界面统计不同用户点击的次数:按小时、天、月、年。规则就是:如果是按小时,那么同一个用户一小时不管点击多少次都算做1次;如果是按天,一天内不管点击多少次也只算做1次,以此类推。
我要做的就是,分析log的信息,数据库存储应该把这些时间单位都考虑进去。DB就是最终数据,以后我如果想在页面按小时、(天、周、月、年)来统计,直接从表里取数据就可以了。
现在问题就是:我该用什么逻辑或者算法,来把log信息转换成我想要的DB信息呢?而且还要考虑按照时间来去除重复数据。
第一点:考虑用户ID,第二点:考虑时间
当你读取一条log信息的时候,取出用户ID和时间,
我不清楚你是实时的在执行往DB里面插入还是过一点时间整理,
如果是实时插入,那么你取出这个log信息的时候,就需要去现在的数据库里面进行匹配
带入用户ID,和时间,时间就以小时计算,如:2014-11-18 17
如果在数据库查询出了这条数据,那么跳出,如果没有查询出结果,那么新增。
第二种情况,如果你是隔一段时间执行一次,那么你就只需要新建一个list集合,
然后用取出的log的集合循环和新的list数据进行匹配,如果遇到有的就跳出,如果在新的list集合里面没有的
那么就添加到新的list集合里面。
写的有点乱,我这里不建议你用list,这样匹配的时候循环工作量非常大,建议使用hashmap,键值对处理起来方便,
以用户ID为key 方便处理。追问
我的想法也是通过用户id和时间去数据库里先找,也就意味着一个用户每天最多有24条记录。但是考虑到未来,如果用户量大到500w,怕数据库扛不住(我们用的mysql)。还有什么更好的方式吗?
追答那你就一个小时执行一次数据整理,这样你就不用去数据库里面找数据了,只需循环取出的log的集合进行循环,然后新增到新的集合里面,循环的同时你需要查询新的集合里面是否有和老集合里面重复的。
追问你的思路我不是很明白 想加你好友来讨论。请指教 我的q:一7八三56756
参考技术A 我觉得你可以先把 所有的访问数据 都保存在数据库里面,这样操作数据库应该比操作天容易。List去除重复元素统计个数
List去除重复元素统计个数
-
集合中存入重复数据,统计每个数据出现的次数
-
把如下元素去掉重复元素存入List集合 “aaa” “bbb” “aaa” “abc”“xyz” “123” “xyz”
这是两道题,用一种方法可以解决,灵活运用即可
public class Test
public static void main(String[] args)
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("bb");
list.add("bb");
list.add("aaa");
list.add("bb");
list.add("ccc");
list.add("ccc");
list.add("aaa");
list.add("ddd");
list.add("eee");
list.add("eee");
list.add("ddd");
list.add("fff");
list.add("ccc");
list.add("fff");
int count;
for (int i = 0; i < list.size(); i++)
count = 1; // 默认出现一次
for (int j = i+1; j < list.size(); j++)
if (list.get(i).equals(list.get(j)))
count++; // 次数+1
list.remove(j);
//list集合remove(),长度改变了,对应的下标也不再是原来的下标
j--;
System.out.println(list.get(i) + "出现次数为:" + count);
System.out.println(list); // 删除重复元素后
以上是关于java 按照时间来统计 去除重复数据的主要内容,如果未能解决你的问题,请参考以下文章