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