如何向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
相关产品推荐
相关产品推荐

