import java.util.*;
public class TopologicalSort {
public static List<Task> sort(List<Task> tasks) {
Map<Task, Integer> inDegree = new HashMap<>();
for (Task task : tasks) {
inDegree.put(task, 0);
}
for (Task task : tasks) {
for (Task prerequisite : task.getPrerequisites()) {
inDegree.put(task, inDegree.get(task) + 1);
}
}
Queue<Task> queue = new LinkedList<>();
for (Map.Entry<Task, Integer> entry : inDegree.entrySet()) {
if (entry.getValue() == 0) {
queue.offer(entry.getKey());
}
}
List<Task> topoOrder = new ArrayList<>();
while (!queue.isEmpty()) {
Task task = queue.poll();
topoOrder.add(task);
for (Task successor : task.getSuccessors()) {
inDegree.put(successor, inDegree.get(successor) - 1);
if (inDegree.get(successor) == 0) {
queue.offer(successor);
}
}
}
if (topoOrder.size() != tasks.size()) {
throw new RuntimeException("Cycle detected in the task dependencies!");
}
return topoOrder;
}
}