Skip to content

不同的广告根据对应的播放次数进行顺序播放

需求

不同的广告,根据对应的播放次数进行顺序播放,直到播放次数为 0。

思路

  1. 过滤掉播放次数小于等于 0 的广告;
  2. 在每一轮广告结束后进行处理,删除播放次数为 0 的广告;
  3. 开始新一轮的播放。

实现

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;
    }
}

Released under the MIT License.