Я придумал довольно наивный рекурсивный алгоритм (псевдокод):
Map<Object, List<Object>> source; // map of each object to its dependency list
List<Object> dest; // destination list
function resolve(a):
if (dest.contains(a)) return;
foreach (b in source[a]):
resolve(b);
dest.add(a);
foreach (a in source):
resolve(a);
Самая большая проблема в этом состоит в том, что он не способен обнаруживать циклические зависимости - он может перейти в бесконечную рекурсию (т. Е. Переполнение стека ;-p). Единственный способ обойти это, что я могу увидеть, это перевернуть рекурсивный алгоритм в интерактивный с ручным стеком и вручную проверить стек на наличие повторяющихся элементов.
Кто-нибудь есть что-нибудь лучше?