package com.zy.acs.manager.core.domain; import com.zy.acs.framework.common.Cools; import lombok.Data; import java.util.*; /** * Created by vincent on 10/24/2024 */ @Data public class Lane { private String laneId; private String hashCode; private List codes = new ArrayList<>(); public Lane() { } public Lane(String laneId) { this.laneId = laneId; } public String[] queryEndPoints() { if (Cools.isEmpty(this.codes)) { return null; } String[] endPoints = new String[2]; if (this.codes.size() == 1) { endPoints[0] = this.codes.get(0); endPoints[1] = this.codes.get(0); } else { endPoints[0] = this.codes.get(0); endPoints[1] = this.codes.get(this.codes.size() - 1); } return endPoints; } public void sortUsingDfs(Map> adjacencyCodeMap) { if (Cools.isEmpty(this.codes) || this.codes.size() < 2) { return; } Set visited = new HashSet<>(); List result = new ArrayList<>(); String startNode = findStartNode(adjacencyCodeMap); dfs(startNode, adjacencyCodeMap, visited, result); for (String code : this.codes) { if (!visited.contains(code)) { dfs(code, adjacencyCodeMap, visited, result); } } this.codes = result; } private String findStartNode(Map> adjacencyCodeMap) { for (String code : this.codes) { List neighbors = adjacencyCodeMap.get(code); if (!Cools.isEmpty(neighbors)) { int count = 0; for (String neighbor : neighbors) { if (this.codes.contains(neighbor)) { count++; } } if (count == 1) { return code; } } } return null; } private static void dfs(String node, Map> adjacencyCodeMap, Set visited, List result) { visited.add(node); result.add(node); if (adjacencyCodeMap.containsKey(node)) { for (String neighbor : adjacencyCodeMap.get(node)) { if (!visited.contains(neighbor)) { dfs(neighbor, adjacencyCodeMap, visited, result); } } } } public void removeInteraction(Map> adjacencyCodeMap) { if (Cools.isEmpty(this.codes)) { return; } this.codes.removeIf(code -> adjacencyCodeMap.get(code).size() > 2); } }