如何从ArrayList<Coord>中获取随机元素且不改变原有Coord的x、y值
问题解决
问题根源
你当前实现的
randomVeretx方法完全没有用到提前存入listVertex的预设坐标,而是每次循环都生成了全新的随机Coord对象,所以才会出现返回的x、y值和预设初始值不一致的问题。
修复方案
核心修改逻辑
- 增加参数合法性校验,避免数组下标越界
- 生成
listVertex下标范围内的随机数,直接通过下标获取已经存入的预设坐标 - 不需要额外生成新
Coord对象,也不会修改原有坐标的x、y值
修复后代码
//retrieve node coordinates from DTNHost. public void getVertex() { List<DTNHost> allNode = SimScenario.getInstance().getHosts(); for (DTNHost host : allNode) { if (host.toString().startsWith("kota")) { listVertex.add(host.getLocation()); } } } //get for random elements from the listVertex ArrayList public ArrayList<Coord> randomVeretx(int max) { // 边界校验,避免下标越界或非法参数 if (listVertex == null || listVertex.isEmpty() || max <= 0 || max > listVertex.size()) { throw new IllegalArgumentException("参数非法或listVertex中无可用坐标"); } Random r = new Random(); ArrayList<Coord> result = new ArrayList<>(max); for (int i = 0; i < max; i++) { // 生成listVertex范围内的合法随机下标 int randomIdx = r.nextInt(listVertex.size()); // 直接取预设坐标,不生成新的坐标对象 result.add(listVertex.get(randomIdx)); } return result; }
补充说明
- 如果你担心后续操作误修改返回的
Coord对象,导致listVertex中的初始值被篡改,可以新增防御性拷贝逻辑,生成值完全一致的新Coord对象返回,不会改变原坐标数值:// 替换result.add那行即可 Coord original = listVertex.get(randomIdx); result.add(new Coord(original.getX(), original.getY())); - 如果要求返回的
max个坐标不能重复,可以额外用Set存储已选中的下标,避免重复随机到同一个位置。
内容的提问来源于stack exchange,提问作者Ipal
相关产品推荐
相关产品推荐

