@Data
@AllArgsConstructor
@NoArgsConstructor
public class Graph {
private Set<String> nodes;
private List<Pair<String, String>> table;
public void remove(String node) {
this.nodes.remove(node);
table.removeIf(pair -> pair.getFrom().equals(node) || pair.getTo().equals(node));
}
public static void main(String[] args) {
Set<String> nodes = Sets.newHashSet("A", "B", "C", "D", "E", "F", "G");
List<String> edges = Lists.newArrayList("G->E", "G->F", "E->D", "F->C","C->B", "C->A","B->A");
List<Pair<String, String>> pairList = edges.stream().map(edge -> {
String[] split = edge.split("->");
String start = split[0];
String end = split[1];
return new Pair<>(start, end);
}).collect(Collectors.toList());
Graph graph = new Graph(nodes, pairList);
Map<String, Integer> inDegree = getInDegree(graph);
System.out.println(inDegree);
List<String> priority = findPriority(graph);
System.out.println(priority);
}
/**
* 获取图中节点的入度
* @param graph
* @return
*/
public static Map<String, Integer> getInDegree(Graph graph) {
Set<String> nodes = graph.getNodes();
List<Pair<String, String>> connectTable = graph.getTable();
Map<String, Integer> map = new ConcurrentHashMap<>();
for (String node : nodes) {
map.put(node,0);
}
for (Pair<String, String> pair : connectTable) {
map.computeIfPresent(pair.getTo(), (k, v) -> v + 1);
}
return map;
}
/**
* 始终寻找入度为0的点,直到所有节点加入结果队列
* @param graph
* @return
*/
public static List<String> findPriority(Graph graph) {
List<String> list = new ArrayList<>();
Set<String> nodes = graph.getNodes();
Map<String, Integer> inDegree = getInDegree(graph);
int size = nodes.size();
int count=0;
while (count<size&&inDegree.keySet().size()!=0) {
System.out.println(inDegree);
for (Map.Entry<String, Integer> entry : inDegree.entrySet()) {
String key = entry.getKey();
if (entry.getValue() == 0) {
list.add(key);
count++;
graph.remove(key);
inDegree = getInDegree(graph);
}
}
}
return list;
}
}