问题:例如,如果任务 A 依赖于任务 B 和 C,这意味着要开始执行任务 A,必须先完成任务 B 和 C。
实现方式:
@Data
public class Task {
private String name;
private List<String> predecessors;
}
public class graph {
public static void main(String[] args) {
Graph<Task, DefaultEdge> directedGraph = new DirectedAcyclicGraph<>(DefaultEdge.class);
List<Task> tasks = new ArrayList<Task>();
//前者依赖于后者
tasks.add(new Task("E", Arrays.asList("B")));
tasks.add(new Task("D", Arrays.asList("A", "B")));
tasks.add(new Task("A", Arrays.asList()));
tasks.add(new Task("B", Arrays.asList("A")));
tasks.add(new Task("C", Arrays.asList("D", "B")));
tasks.add(new Task("F", Arrays.asList("E")));
Map<String, Task> taskNameToTaskMap = tasks.stream()
.collect(Collectors.toMap(task -> task.getName(), task -> task));
for (Task task : tasks) {
directedGraph.addVertex(task);
for (String predecessor : task.getPredecessors()) {
Task predecessorTask = taskNameToTaskMap.get(predecessor);
directedGraph.addVertex(predecessorTask);
directedGraph.addEdge(predecessorTask, task);
}
}
TopologicalOrderIterator<Task, DefaultEdge> moreDependencyFirstIterator = new TopologicalOrderIterator<>(
directedGraph);
moreDependencyFirstIterator.forEachRemaining(task -> System.out.println(task.getName()));
}
}
运行结果:
A
B
E
D
F
C