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); 
 | 
    } 
 | 
  
 | 
} 
 |