如何按另一数组顺序重排ArrayList?TSP算法优化相关问题
旅行商问题路径重排及static ArrayList相关疑问
我现在结合两种算法解决旅行商问题(TSP)来获取最优路径:
- 第一种算法基于
environmentArrayList生成了最优路径数组:[10, 4, 3, 7, 9, 2, 1, 5, 8, 6] - 第二种算法需要根据这个路径对
environmentArrayList进行重排,但这一步卡住了;同时想知道把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会有这些影响:
- 全局共享:static属于类级别,所有该类的实例都会共用同一个
environment列表。如果你在某个地方重排了它,所有其他使用这个列表的代码都会看到重排后的结果,容易引发意料之外的bug。 - 线程安全问题:如果是多线程环境,多个线程同时修改这个static列表会导致并发修改异常,需要额外加锁同步。
- 可维护性差:static状态会让代码的依赖关系变得不清晰,排查问题时更困难。
如果你的重排操作只是当前逻辑需要,建议不要直接修改static列表,而是创建它的副本进行操作,比如:
// 创建原列表的副本,后续操作副本 ArrayList<Node> tempEnv = new ArrayList<>(environment);
内容的提问来源于stack exchange,提问作者obito357
相关产品推荐
相关产品推荐

