| 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<String> 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<String, List<String>> adjacencyCodeMap) { | 
|         if (Cools.isEmpty(this.codes) || this.codes.size() < 2) { | 
|             return; | 
|         } | 
|         Set<String> visited = new HashSet<>(); | 
|         List<String> 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<String, List<String>> adjacencyCodeMap) { | 
|         for (String code : this.codes) { | 
|             List<String> 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<String, List<String>> adjacencyCodeMap, Set<String> visited, List<String> 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<String, List<String>> adjacencyCodeMap) { | 
|         if (Cools.isEmpty(this.codes)) { | 
|             return; | 
|         } | 
|         this.codes.removeIf(code -> adjacencyCodeMap.get(code).size() > 2); | 
|     } | 
|   | 
| } |