| | |
| | | |
| | | // 遍历所有节点,寻找度数不等于2的节点作为起点 |
| | | for (String codeData : codeDataList) { |
| | | if (adjacencyCodeMap.getOrDefault(codeData, Collections.emptyList()).size() != 2) { |
| | | List<String> neighbors = adjacencyCodeMap.getOrDefault(codeData, Collections.emptyList()); |
| | | if (adjacencyCodeMap.get(codeData).size() != 2) { |
| | | List<String> neighbors = adjacencyCodeMap.get(codeData); |
| | | for (String neighbor : neighbors) { |
| | | if (adjacencyCodeMap.getOrDefault(neighbor, Collections.emptyList()).size() == 2 && !visited.contains(neighbor)) { |
| | | if (adjacencyCodeMap.get(neighbor).size() == 2 && !visited.contains(neighbor)) { |
| | | Lane lane = new Lane(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | lane.getCodes().add(codeData); // 包含起点 |
| | | dfsCalcIncludingEnd(codeData, neighbor, lane, visited, adjacencyCodeMap); |
| | |
| | | |
| | | // 处理独立的度数为2的环路或未连接到度数不等于2的节点的部分 |
| | | for (String codeData : codeDataList) { |
| | | if (adjacencyCodeMap.getOrDefault(codeData, Collections.emptyList()).size() == 2 && !visited.contains(codeData)) { |
| | | if (adjacencyCodeMap.get(codeData).size() == 2 && !visited.contains(codeData)) { |
| | | // 检查是否为环路的一部分 |
| | | Lane lane = new Lane(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); |
| | | dfsCalcForLoop(codeData, null, lane, visited, adjacencyCodeMap); |
| | |
| | | lane.getCodes().add(current); |
| | | visited.add(current); |
| | | |
| | | List<String> neighbors = adjacencyCodeMap.getOrDefault(current, Collections.emptyList()); |
| | | List<String> neighbors = adjacencyCodeMap.get(current); |
| | | if (neighbors == null || neighbors.isEmpty()) { |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | if (!visited.contains(neighbor)) { |
| | | int degree = adjacencyCodeMap.getOrDefault(neighbor, Collections.emptyList()).size(); |
| | | int degree = adjacencyCodeMap.get(neighbor).size(); |
| | | if (degree == 2) { |
| | | if (isSameDirection(current, neighbor, start)) { |
| | | dfsCalcIncludingEnd(current, neighbor, lane, visited, adjacencyCodeMap); |
| | |
| | | lane.getCodes().add(current); |
| | | visited.add(current); |
| | | |
| | | List<String> neighbors = adjacencyCodeMap.getOrDefault(current, Collections.emptyList()); |
| | | List<String> neighbors = adjacencyCodeMap.get(current); |
| | | if (neighbors == null || neighbors.isEmpty()) { |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | if (!visited.contains(neighbor)) { |
| | | int degree = adjacencyCodeMap.getOrDefault(neighbor, Collections.emptyList()).size(); |
| | | int degree = adjacencyCodeMap.get(neighbor).size(); |
| | | if (degree == 2) { |
| | | if (isSameDirection(current, neighbor, parent)) { |
| | | dfsCalcForLoop(current, neighbor, lane, visited, adjacencyCodeMap); |