如何从ArrayList中随机抽取元素并移除,解决抽取结果不在列表内的问题
代码问题原因及修正方案
核心错误点
你的代码混淆了列表索引和列表存储的元素值:
rnd.nextInt(list1.size())生成的本身就是0到list1.size()-1范围内的合法索引,你直接用该值作为索引定位元素即可。但你现有的逻辑是把list1.get()返回的元素值当成了remove()操作的入参,当元素值大于当前list1的最大索引时,就会触发索引越界错误,也就是你遇到的“生成不存在数值”的问题。- 另外你提供的代码片段中没有初始化
list1的1~50数值,也会导致空列表操作异常。
修正后代码
import java.util.ArrayList; import java.util.Random; public class RandomDraw { public static void main(String[] args) { Random rnd = new Random(); ArrayList<Integer> list1 = new ArrayList<>(); ArrayList<Integer> list2 = new ArrayList<>(); // 初始化list1,填充1到50的数值 for (int i = 1; i <= 50; i++) { list1.add(i); } // 当原列表非空时持续抽取 while (!list1.isEmpty()) { // 生成合法随机索引 int randomIndex = rnd.nextInt(list1.size()); // 按索引取抽取的元素 int drawValue = list1.get(randomIndex); list2.add(drawValue); // 按索引删除原列表元素,不要传入元素值 list1.remove(randomIndex); } // 验证输出 System.out.println("随机抽取结果:" + list2); } }
更简洁的实现方案
你要实现的“无放回随机抽取全量元素”等价于对列表做随机打乱,直接用JDK自带的Collections.shuffle()方法即可完成,无需手动实现循环抽取逻辑:
import java.util.ArrayList; import java.util.Collections; public class RandomDraw { public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<>(); for (int i = 1; i <= 50; i++) { list1.add(i); } // 随机打乱原列表 Collections.shuffle(list1); // 打乱后的list1就是随机排序的抽取结果,可直接赋值给list2 ArrayList<Integer> list2 = new ArrayList<>(list1); } }
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

