Похоже, у вас есть набор DAG (ациклические ориентированные графы).Я думаю, вам нужно смоделировать это, а затем выполнить топологическую сортировку каждого из них.Один подход:
Обернуть каждый элемент в объект-оболочку, который ссылается на объект и имеет список для хранения зависимостей от других объектов.Поместите все эти обертки в hashMap с ключом по идентификатору объекта.
Для всех элементов без прямых зависимостей выведите элемент и удалите его из hashMap.Повторяйте, пока hashmap не станет пустым.
Если списки зависимостей часто бывают длинными, это будет неэффективно.Он предназначен для среднего числа прямых зависимостей до 5 или около того.Если производительность является проблемой из-за того, что выполняется слишком много проходов «Повторить, пока хэш-карта пуста», следует использовать двунаправленную структуру данных для представления графов зависимостей или, возможно, список записей карты, которые имеют только одну зависимость от этого проходаи, следовательно, являются сильными кандидатами на следующий проход.
Вот непроверенный эскиз:
class Obj { String id; }
class ObjWrapper {
String id;
Obj obj;
String[] depends; // may be null, may have null entries
public ObjWrapper(Obj obj, String[] depends) {
this.id = obj.id;
this.obj = obj;
if ( depends != null )
this.depends = Arrays.copyOf(depends, depends.length);
}
}
// order the objects by dependency.
ArrayList<Obj> orderObjs(Iterable<ObjWrapper> objs)
{
ArrayList<Obj> output = new ArrayList();
HashMap<String, ObjWrapper> objMap = new HashMap();
for ( ObjWrapper obj : objs )
objMap.put(obj.id, obj);
while ( !objMap.isEmpty() ) {
Iterator<ObjWrapper> iter = objMap.values().iterator();
while ( iter.hasNext() ) {
ObjWrapper objWrapper = iter.next();
if ( !hasDependencies(objWrapper, objMap) ) {
output.add(objWrapper.obj);
// must use iter to remove from hash, or bad things happen.
iter.remove();
}
}
}
return output;
}
boolean hasDependencies(ObjWrapper objWrapper,
HashMap<String, ObjWrapper> objMap)
{
if ( objWrapper.depends == null ) return false;
for ( String depend : objWrapper.depends ) {
if ( depend != null )
if ( objMap.containsKey(depend) )
return true;
else
depend = null; // to speed up future passes
}
return false;
}