Appearance
不同的广告根据对应的播放次数进行顺序播放
需求
不同的广告,根据对应的播放次数进行顺序播放,直到播放次数为 0。
思路
- 过滤掉播放次数小于等于 0 的广告;
- 在每一轮广告结束后进行处理,删除播放次数为 0 的广告;
- 开始新一轮的播放。
实现
java
/**
* 不同的广告根据对应的播放次数生成广告播放列表
* @param ads 待处理的不同广告
* @return 广告播放列表
*/
private static String[] sequentialSplit(List<Ad> ads) {
// 过滤掉播放次数小于等于 0 的广告
ads = ads.stream().filter(ad -> ad.getPlayCount() > 0).collect(Collectors.toList());
ads.forEach(ad -> System.out.println("广告名称:" + ad.getName() + ",广告播放次数:" + ad.getPlayCount()));
int sum = ads.stream().mapToInt(Ad::getPlayCount).sum();
System.out.println("预计播放次数:" + sum);
System.out.println("----------------------------");
int adListSize = ads.size();
int j = 0;
Ad ad;
String[] strings = new String[sum];
for (int i = 0, length = strings.length; i < length; i++) {
if (adListSize == 0) {
break;
} else {
ad = ads.get(j);
}
strings[i] = ad.getName();
j++;
int playCount = ad.getPlayCount();
ad.setPlayCount(playCount - 1);
// 在每一轮广告结束后进行处理
if (j == adListSize) {
// 删除播放次数为 0 的广告
ads.removeIf(ad1 -> ad1.getPlayCount() == 0);
// 开始新一轮的播放
adListSize = ads.size();
j = 0;
}
}
return strings;
}
测试
java
public static void main(String[] args) {
List<Ad> ads = new ArrayList<>();
ads.add(new Ad("中餐", 3));
ads.add(new Ad("西餐", 4));
ads.add(new Ad("烧烤", 2));
ads.add(new Ad("火锅", 6));
String[] strings = sequentialSplit(ads);
for (String s : strings) {
System.out.println(s);
}
System.out.println("实际播放次数:" + strings.length);
}
广告名称:中餐,广告播放次数:3
广告名称:西餐,广告播放次数:4
广告名称:烧烤,广告播放次数:2
广告名称:火锅,广告播放次数:6
预计播放次数:15
----------------------------
中餐
西餐
烧烤
火锅
中餐
西餐
烧烤
火锅
中餐
西餐
火锅
西餐
火锅
火锅
火锅
实际播放次数:15
完整代码
java
package study.helloworld.something4j._2020._04._16;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 不同的广告根据对应的播放次数进行顺序播放
*/
public class SequentialSplitByFrequency {
public static void main(String[] args) {
List<Ad> ads = new ArrayList<>();
ads.add(new Ad("中餐", 3));
ads.add(new Ad("西餐", 4));
ads.add(new Ad("烧烤", 2));
ads.add(new Ad("火锅", 6));
String[] strings = sequentialSplit(ads);
for (String s : strings) {
System.out.println(s);
}
System.out.println("实际播放次数:" + strings.length);
}
/**
* 不同的广告根据对应的播放次数生成广告播放列表
* @param ads 待处理的不同广告
* @return 广告播放列表
*/
private static String[] sequentialSplit(List<Ad> ads) {
// 过滤掉播放次数小于等于 0 的广告
ads = ads.stream().filter(ad -> ad.getPlayCount() > 0).collect(Collectors.toList());
ads.forEach(ad -> System.out.println("广告名称:" + ad.getName() + ",广告播放次数:" + ad.getPlayCount()));
int sum = ads.stream().mapToInt(Ad::getPlayCount).sum();
System.out.println("预计播放次数:" + sum);
System.out.println("----------------------------");
int adListSize = ads.size();
int j = 0;
Ad ad;
String[] strings = new String[sum];
for (int i = 0, length = strings.length; i < length; i++) {
if (adListSize == 0) {
break;
} else {
ad = ads.get(j);
}
strings[i] = ad.getName();
j++;
int playCount = ad.getPlayCount();
ad.setPlayCount(playCount - 1);
// 在每一轮广告结束后进行处理
if (j == adListSize) {
// 删除播放次数为 0 的广告
ads.removeIf(ad1 -> ad1.getPlayCount() == 0);
// 开始新一轮的播放
adListSize = ads.size();
j = 0;
}
}
return strings;
}
}
/**
* 广告
*/
class Ad {
/**
* 广告名称
*/
private String name;
/**
* 广告播放次数
*/
private int PlayCount;
public Ad(String name, int playCount) {
this.name = name;
PlayCount = playCount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPlayCount() {
return PlayCount;
}
public void setPlayCount(int playCount) {
PlayCount = playCount;
}
}