|  |  |  | 
|---|
|  |  |  | package com.zy.acs.manager.core.domain; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.zy.acs.framework.common.Cools; | 
|---|
|  |  |  | import lombok.Data; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * Created by vincent on 10/24/2024 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String laneId; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private String hashCode; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private List<String> codes = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public Lane() { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|