Я пытался эффективно создавать деревья, присваивая дочерний элемент его родителю, а затем удаляя его с помощью it.remove()
:
for (OgOrganizationTreeDTO parent : parents) {
setChildren(parent, organizationTree);
}
Вот реализация setChildren
функции
private void setChildren(OgOrganizationTreeDTO root, List<OgOrganizationTreeDTO> allOrganizations) {
if (allOrganizations.isEmpty()) {
return ;
}
Iterator<OgOrganizationTreeDTO> it = allOrganizations.iterator();
while (it.hasNext()) {
OgOrganizationTreeDTO potentialChild = it.next();
if (potentialChild.getIdParentId() != null && potentialChild.getIdParentId().equals(root.getId())) {
root.addChild(potentialChild);
it.remove();
setChildren(potentialChild, allOrganizations);
}
}
}
Я использую LinkedList и получаю ConcurrentModificationException
.Я решил проблему, передав копию allOrganizations
в рекурсивную функцию setChildren
, например, new LinkedList<>(allOrganizations)
, но часть копирования занимает O(n)
время, и я этого не хочу.
Я также пытался использовать LinkedBlockingQueue
, но обнаружил, что удаление занимает O(n)
время.
Я хочу воспользоваться удалением LinkedList
O(1)
, поэтому каждый раз, когда я добавляю дочерний элемент и повторяю его, список уменьшается.
Я также успешно реализовал решениес HashSet
, помечая отдельные узлы как видимые, и устанавливая базовый случай на hashSet.size() == allOrganizations.size()
, но я все еще продолжаю повторяться по списку того же размера, так что это не поможет мне другим.
Есть ли какие-либоспособ достижения моей цели с использованием LinkedList
O(1)
remove, или есть еще более эффективный альтернативный подход к этому?