You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向ArrayList中添加JSON读取的随机字符串且不产生重复元素

实现方案

核心逻辑

  • 首次初始化时一次性读取JSON文件内的所有字符串,存入独立的候选池集合,避免每次点击按钮重复执行IO操作
  • 每次点击按钮时从候选池随机取出一个元素,直接加入目标ArrayList,同时将该元素从候选池中移除,从根源上杜绝重复添加的问题
  • 候选池为空时可按需配置兜底逻辑,比如提示全部抽取完成、重置候选池重新抽取

代码示例(Java环境)

初始化部分(仅执行一次)

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

// 存储所有可选字符串的候选池
private List<String> candidatePool;
// 目标存储集合
private final ArrayList<String> targetList = new ArrayList<>();
private final Random random = new Random();

// 应用启动/页面初始化时执行一次,读取JSON文件到候选池
private void initCandidatePool() throws Exception {
    // 假设JSON文件结构为字符串数组:["示例1","示例2","示例3"]
    ObjectMapper objectMapper = new ObjectMapper();
    candidatePool = objectMapper.readValue(
        new File("你的JSON文件本地路径"),
        new TypeReference<List<String>>() {}
    );
}

按钮点击事件逻辑

public void onButtonClick() {
    if (candidatePool == null || candidatePool.isEmpty()) {
        // 候选池为空的兜底逻辑,可根据需求修改
        System.out.println("所有字符串已全部抽取完成");
        // 如需重置抽取逻辑,重新调用initCandidatePool()初始化候选池即可
        return;
    }
    // 生成候选池范围内的随机下标
    int randomIndex = random.nextInt(candidatePool.size());
    // 取出元素同时从候选池移除
    String pickedStr = candidatePool.remove(randomIndex);
    // 加入目标集合
    targetList.add(pickedStr);
}

注:JSON解析部分可替换为项目当前使用的任意JSON处理库(Gson、FastJSON等),核心逻辑不依赖特定第三方组件。

方案优势

如果采用「每次随机读取JSON元素后判断是否已存在于ArrayList再添加」的方案,当剩余可选元素较少时会产生大量无效随机重试,效率极低。本方案每次操作的时间复杂度为O(1),性能稳定,也不需要额外的判重逻辑。


内容的提问来源于stack exchange,提问作者Andrei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:04