玩家在线时长统计

玩家在线时长统计

一月 30, 2019

问题来源

最近服务端在做数据统计时遇到这个问题,我对算法有点兴趣,便动手弄起来。

问题描述

一个账号有多个角色,通过角色的在线时长统计玩家的在线时长,多个角色如果有叠加的部分只能算一份。
一个平台账号登录,可以创建多个角色进入游戏,同个角色不能在两台设备上同时玩游戏。同个账号不同角色可以在不同设备上进行游戏。
一个玩家有多个角色,多个角色可以在不同的机器同时进行游戏。两个角色同时在线时间,不能叠加计算
假如有一个角色在线时间是 7点10分-8点10分在线,10点20分-12点20分在线。 当天的角色在线时长是 3小时。
另外个角色时间段比如 7点20分-8点20分在线,当天角色在线时长是1小时
这样,玩家在线时长总和是, 1个小时10分 + 2小时 = 3小时10分

解决方法

本人方法比较笨戳
把一天的时间分成片段,五分钟一个片段,一天就有288个片段,从0到288。用位数组来存储288个片段,如果那个位是1则在线,如果是0则不在线。
每天会给角色计算位数组,比如10点到11点在线,那120 - 132片段是记为1。
假如角色A的部分片段是0110110
角色B的部分片段是0001010
那么玩家的在线时长是A或B 0111110
计算玩家在线时长测试代码

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
public void testBit(){
// 角色1
BitArray roler1 = new BitArray(288);
roler1.set(1,true);// 设置第二个五分钟在线
roler1.set(2, true);// 设置第三个五分钟在线

// 角色2
BitArray roler2 = new BitArray(288);
roler2.set(2,true);// 设置第三个五分钟在线
roler2.set(3, true);// 设置第四个五分钟在线

// 玩家
BitArray player = new BitArray(288);

for (int i=0; i< roler1.length(); i++){
// 或运算,计算得出玩家的在线时长
player.set(i, roler1.get(i)|roler2.get(i));
}

System.out.println(roler1.toString());

System.out.println("-------------------");

System.out.println(roler2.toString());
System.out.println("-------------------");

System.out.println(player.toString());
}