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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:18:04