随机获取某个集合中的某个元素,多次获取时不重复

2024-01-17 08:36:55 浏览数 (1)

譬如想随机获取某个集合中的某个数,用户多次请求时尽量不给用户返回重复的数。

倘若用random的nextInt方法,当只有两三个元素时,则很可能多次请求返回的都是同一个,体验很差。

所以我们应该尽快让多次请求时,返回的不重复。

代码如下

代码语言:javascript复制
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 产生随机Random的工具类
 *@author weifengwu
 *@create 2024/1/15 12:05
 */
@Component
public class CpSceneCardListOffer {
    private final CopyOnWriteArrayList<String> dataList = new CopyOnWriteArrayList<>();
    private final CopyOnWriteArrayList<String> usedList = new CopyOnWriteArrayList<>();

    public void addAll(List<String> list) {
        if (dataList.equals(list)) {
            return;
        }
        dataList.clear();
        dataList.addAll(list);
    }

    /**
     * 每次提供一个
     */
    public synchronized String getRandomElement() {
        if (dataList.isEmpty()) {
            // 如果列表中的元素已经用尽,可以选择重新填充或者返回空值
            return null;
        }

        Collections.shuffle(dataList); // 随机打乱列表顺序
        String element = dataList.remove(0); // 移除并返回第一个元素
        usedList.add(element);

        if (dataList.isEmpty()) {
            // 如果列表中的元素已经用尽,将已使用的元素重新放回列表以实现循环使用
            dataList.addAll(usedList);
            usedList.clear();
        }

        return element;
    }

}

0 人点赞