取四个场次

问题

假设一个活动中,有 n 个(n的范围是 1<n<10)场次,场次按时间顺序依次进行。
其中每个场次有三种状态:「未开始」、「进行中」、「已结束」
要求:以当前时间点为参考点,从场次列表中获取最多 4 个场次。
场次具体要求如下:

  1. 不满足 4 场次或正好 4 场次的全部返回。
  2. 大于 4 场次时,获取的四个场次有下面这些情况(场次充足的情况下,只有一个【已结束】的场次):
    【未开始、未开始、未开始、未开始】
    【已结束、未开始、未开始、未开始】
    【已结束、进行中、未开始、未开始】

解决文案:

突破点

找到【已结束】的下标,并以此下标为中心来推断其它几个场次。

具体解决步骤

  1. 少于 4 场次,全部返回;
  2. 多余 4 场次,按以下规则取
    设:index 为最后一个已结束的场次下标,size 为场次列表数量,hasNext 为是否有下一个场次
    <1. 如果:index=-1 时,表示都没结束,取前 4 个;hasNext=true
    <2. 如果:size-index<=4 时,表示未结束的不多了,取后 4 个;hasNext=false
    <3. 否则:取 index、index+1、index+2、index+3;hasNext=true

示例代码

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
public class Test {
/**
* 最多展示 4 个场次
*/
private static final int MAX_SCENE_SIZE = 4;

private Result getResult(List<SceneModel> candidateSceneList) {
Result result = new Result();
final int size = candidateSceneList.size();

// 不足4场次全部返回
if (size <= MAX_SCENE_SIZE) {
result.setHasNext(false);
result.setSceneList(candidateSceneList);
return result;
}

// 多余4场次,按以下规则取
List<SceneModel> resultList;

// 获取最后一个已结束的场次下标
int index = getLastFinishedSceneIndex(candidateSceneList);

// 1. 如果:index=-1 时,表示都没结束,取前4个;hasNext=true
if (index == -1) {
resultList = candidateSceneList.subList(0, MAX_SCENE_SIZE);
result.setSceneList(resultList);
result.setHasNext(true);
return result;
}

// 2. 如果:size-index<=4 时,表示未结束的不多了,取后4个;hasNext=false
if (size - index <= MAX_SCENE_SIZE) {
resultList = candidateSceneList.subList(size - MAX_SCENE_SIZE, size);
result.setSceneList(resultList);
result.setHasNext(false);
return result;
}

// 3. 否则:取index、index+1、index+2、index+3;hasNext=true
resultList = candidateSceneList.subList(index, index + MAX_SCENE_SIZE);
result.setSceneList(resultList);
result.setHasNext(true);
return result;
}
}