问题比较复杂,跪求解决方法(时间段解析并计数)

fgod 发布于 2016/05/10 17:29
阅读 210
收藏 0

大家好,我正做的是一个广告位轮播上限控制,多担待下,叙述不全的地方敬请指教

广告订单需要选择要投的广告位(1-n),还要选择投放的时间段(1-n);

      (广告位投放时间跟着使用它的订单)

比如订单1 选择了广告位1和广告位2,想要在2016-05-10至2016-05-16(可多个时间段)投放;

订单2 选择了广告位1,想要在2016-05-8至2016-05-12投放;

而对于广告位是有轮播上限的,也就是每一天里面只能投放限定的广告数量,比如广告位轮播上限为2;

(轮播上限就是说这个广告位置同一天只能有几个广告轮流播放)

那么上面两个订单的组合结果就是:

广告位1: 从8号到16的使用情况就是:8,9号是一个广告,10-12这3天是2个广告,13-16是一个广告;

广告位2(略)。

现在纠结的问题是怎么在后台判断这个新增订单(比如订单2)在它选择的投放时间段里(8-12日)是符合他所选择的广告位(广告位1)所设定的轮播上限(2个);

(超过了就得重新选择时间段)

现有的数据存储情况是:1.订单与广告位的关联 

2.订单的投放时间段存储

时间段类型为date

3.广告位的轮播上限

MultiLimit 就是轮播的广告位个数

下面是我现有的一个思路,附在回复里好了,太长。。大家也可以从我的思路里知道得更为清晰

加载中
1
景愿
景愿

现在有三个概念:时间段,广告位,上限,我不清楚你们的发布功能如何的,简单的说下

假设投放多个广告位的多个时间段,多个广告位的时间段不同

1. 按照类似笛卡尔积的做法将所有广告位和时间段的组合全部列出来

2. 对列出的结果循环,查找广告位的该时间段中的所有订单(性能考虑,一次全部查出来)

3. 其中由于其他广告可能是穿插在这个时间段中,所以需要继续按照查询结果在细分时间段(你的方法是按照天整型化后计算,这样通用性并不好,假设投放时间需按小时,你的算法基本废了,所以还是要按照时间节点来分段处理)

4. 对细分的时间段在做计算看是否有某一个细分时间段内超出的这个广告位上限


伪代码我就不写了,涉及到大量的数据结构处理,挺麻烦的

f
fgod
谢谢
0
f
fgod

前台需要给我的是目前他所选择的广告位和时间段(都可以是多个),现在说选择一个广告位和选择一个时间段的情况。

根据传递过来的广告位ID , 后台获取此广告位的轮播上限,MultiLimit = limit;

根据传递过来的广告位ID,后台获取正在使用此广告位的订单以及订单的投放时间段(拿出来就是时间戳了);(假设之前判断正确,那么现有的多个订单和多个时间段组合后是满足该广告位每天的投放个数都<=limit;)

   获取到的数据: 多个正在使用的投放时间段。

我现在写一个方法method,解析一个时间段;创建一个收集所有日期的ListAll;

    1. 把开始时间和结束时间都解析成20160510,和20160516的字符串,

       然后再转换成int类型,得到两个数字;

    2.根据这两个数字,往ListAll里面添加数字(从20160510到20160516,现在忽略跨月份需处理的问题),这个时间段就是添加7个数字;  

    3.接着遍历正在使用的每个投放时间段,都添加进ListAll集合里面,装载完已经使用的时间段

    4.接着需要拿到前端传过来的新增订单所选择的时间段(1个或多个),也添加到这个ListAll里。

到此,相当于这个广告位哪天有广告以及几个广告的信息其实都已经在这个集合里面了。

 5, 创建一个hashMap,key 就是20100510,value就需要这一天的广告count值,

      遍历这个ListAll 集合, 

      然后以 h.containsKey("20100510") 方法滤重并计数。

            没有就是h.put("20100510",1),有就是h.put("20100510",h.get(20100510)+1),

            接着就是conut 与limit的比较了;

            if(h.get("20100510")>limit),那么记录下这一天

然后再是根据记录下的超过上限的那些天,解析返回提示。。。 当然还没具体实现,会有各种问题;不知道大家有没有好的提点!!急急急

       



返回顶部
顶部