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

如何按另一数组顺序重排ArrayList?TSP算法优化相关问题

旅行商问题路径重排及static ArrayList相关疑问

我现在结合两种算法解决旅行商问题(TSP)来获取最优路径:

  • 第一种算法基于environment ArrayList生成了最优路径数组:[10, 4, 3, 7, 9, 2, 1, 5, 8, 6]
  • 第二种算法需要根据这个路径对environment ArrayList进行重排,但这一步卡住了;同时想知道把ArrayList设为static会不会影响重排操作。

现有代码示例

static ArrayList<Node> environment = new ArrayList<Node>(Arrays.asList(
        new Node("1", 19, -121),
        new Node("2", 343, -132),
        new Node("3", 21, -132),
        new Node("4", 47, -122),
        new Node("5", 35, -139),
        new Node("6", -54, 165),
        new Node("7", -45, 21),
        new Node("8", 89, -65),
        new Node("9", 58, -72),
        new Node("10", 21, -54)
));

路径重排的实现方法

要根据路径数组重排environment,核心是建立节点编号到Node对象的映射,再按路径顺序重新组装列表:

方法1:创建新的重排后列表(推荐,不修改原列表)

// 先构建编号到Node的映射,方便快速查找
Map<String, Node> nodeMap = new HashMap<>();
for (Node node : environment) {
    nodeMap.put(node.getId(), node); // 假设Node类有getId()方法返回编号字符串
}

// 路径数组
int[] optimalPath = {10, 4, 3, 7, 9, 2, 1, 5, 8, 6};
ArrayList<Node> rearrangedEnvironment = new ArrayList<>();

// 按路径顺序添加节点
for (int id : optimalPath) {
    Node node = nodeMap.get(String.valueOf(id));
    if (node != null) {
        rearrangedEnvironment.add(node);
    }
}

方法2:直接修改原ArrayList(不推荐,尤其是static列表)

如果一定要修改原列表,可以先保存原元素,清空后按顺序重新添加:

int[] optimalPath = {10, 4, 3, 7, 9, 2, 1, 5, 8, 6};
Map<String, Node> nodeMap = new HashMap<>();
for (Node node : environment) {
    nodeMap.put(node.getId(), node);
}

// 清空原列表,按路径重新添加
environment.clear();
for (int id : optimalPath) {
    Node node = nodeMap.get(String.valueOf(id));
    if (node != null) {
        environment.add(node);
    }
}

static ArrayList对重排的影响

把ArrayList设为static会有这些影响:

  1. 全局共享:static属于类级别,所有该类的实例都会共用同一个environment列表。如果你在某个地方重排了它,所有其他使用这个列表的代码都会看到重排后的结果,容易引发意料之外的bug。
  2. 线程安全问题:如果是多线程环境,多个线程同时修改这个static列表会导致并发修改异常,需要额外加锁同步。
  3. 可维护性差:static状态会让代码的依赖关系变得不清晰,排查问题时更困难。

如果你的重排操作只是当前逻辑需要,建议不要直接修改static列表,而是创建它的副本进行操作,比如:

// 创建原列表的副本,后续操作副本
ArrayList<Node> tempEnv = new ArrayList<>(environment);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:45:35