以下代码声明了一个节点类,分别根据parentId和childId来判断新增父子关系是否导致有闭环的方法。
package com.test.demo.tu;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
public class CheckLoop {
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Node {
private Integer id;
private List<Integer> parentIds;
private List<Integer> childIds;
}
public static void main(String[] args) {
long l = System.currentTimeMillis();
Integer preId = 5, nextId = 3;
Map<Integer, Node> map = create();
Set<Integer> checked = new HashSet<>();
Set<Integer> repeat = new HashSet<>();
if (map.get(nextId) == null||map.get(preId)==null) {
return;
}
boolean result = execute(preId, nextId, map, checked, repeat);
System.out.println(checked);
System.out.println(repeat);
System.out.println(result);
System.out.println(System.currentTimeMillis() - l);
long l1 = System.currentTimeMillis();
Integer preId1 = 5, nextId1 = 3;
Map<Integer, Node> map1 = create();
Set<Integer> checked1 = new HashSet<>();
Set<Integer> repeat1 = new HashSet<>();
if (map1.get(nextId1) == null||map1.get(preId1)==null) {
return;
}
boolean result1 = execute1(nextId1,preId1 , map1, checked1, repeat1);
System.out.println(checked1);
System.out.println(repeat1);
System.out.println(result1);
System.out.println(System.currentTimeMillis() - l1);
}
public static boolean execute(int currId, int nextId, Map<Integer, Node> map, Set<Integer> checked, Set<Integer> repeat) {
if (checked.contains(currId)) {
return true;
}
if (repeat.contains(currId)) {
return false;
}
repeat.add(currId);
Node node = map.get(currId);
List<Integer> parentIds = node.getParentIds();
if (parentIds==null||parentIds.size() == 0 ){
return true;
}
if (parentIds.contains(nextId)) {
return false;
} else {
for (Integer parentId : parentIds) {
if (!execute(parentId, nextId, map, checked, repeat)) {
return false;
} else {
checked.add(parentId);
}
}
}
checked.add(currId);
return true;
}
public static boolean execute1(int currId, int preId, Map<Integer, Node> map, Set<Integer> checked, Set<Integer> repeat) {
if (checked.contains(currId)) {
return true;
}
if (repeat.contains(currId)) {
return false;
}
repeat.add(currId);
Node node = map.get(currId);
List<Integer> childIds = node.getChildIds();
if (childIds!=null&&childIds.size() > 0 ){
if (childIds.contains(preId)) {
return false;
} else {
for (Integer childId : childIds) {
if (!execute1(childId, preId, map, checked, repeat)) {
return false;
} else {
checked.add(childId);
}
}
}
}
checked.add(currId);
return true;
}
public static Map<Integer, Node> create() {
Node node0 = new Node();
node0.setId(1);
List<Integer> list0 = new ArrayList<>();
list0.add(1);
node0.setChildIds(list0);
node0.setParentIds(new ArrayList<>());
Node node1 = new Node();
node1.setId(1);
List<Integer> list1 = new ArrayList<>();
list1.add(2);
list1.add(3);
node1.setChildIds(list1);
List<Integer> parent1 = new ArrayList<>();
parent1.add(0);
node1.setParentIds(parent1);
Node node2 = new Node();
node2.setId(2);
List<Integer> list2 = new ArrayList<>();
list2.add(4);
node2.setChildIds(list2);
List<Integer> parent2 = new ArrayList<>();
parent2.add(1);
node2.setParentIds(parent2);
Node node3 = new Node();
node3.setId(3);
List<Integer> list3 = new ArrayList<>();
list3.add(4);
node3.setChildIds(list3);
List<Integer> parent3 = new ArrayList<>();
parent3.add(1);
node3.setParentIds(parent3);
Node node4 = new Node();
node4.setId(4);
List<Integer> list4 = new ArrayList<>();
list4.add(5);
node4.setChildIds(list4);
List<Integer> parent4 = new ArrayList<>();
parent4.add(3);
parent4.add(2);
node4.setParentIds(parent4);
Node node5 = new Node();
node5.setId(5);
List<Integer> list5 = new ArrayList<>();
list5.add(3);
node5.setChildIds(list5);
List<Integer> parent5 = new ArrayList<>();
parent5.add(4);
node5.setParentIds(parent5);
Node node6 = new Node();
node6.setId(6);
Map<Integer, Node> map = new HashMap<>();
map.put(0, node0);
map.put(1, node1);
map.put(2, node2);
map.put(3, node3);
map.put(4, node4);
map.put(5, node5);
map.put(6, node6);
System.out.println(map);
return map;
}
}