Как правильно отсортировать объекты, которые содержат другие объекты внутри себя?

Как можно оптимальным образом отсортировать список объектов указанного типа таким образом, чтобы объекты без родителя находились в начале списка, затем следовали бы объекты-дочерние элементы в порядке убывания, а объекты без дочерних элементов находились в конце списка?
  • 14 марта 2024 г. 14:59
Ответы на вопрос 3
Для отсортировки объектов, содержащих другие объекты внутри себя, сначала нужно реализовать функцию сортировки, которая будет сравнивать объекты с учетом их вложенности. 

Одним из способов решения вашей задачи может быть использование рекурсивной функции, которая будет проходить по всем объектам и их дочерним элементам, определять их родителей и сортировать их соответственно вашим требованиям.

Пример на Python:

```python
class Object:
    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent
        self.children = []

def sort_objects(objects):
    def compare(obj):
        if obj.parent is None:
            return 0
        elif obj.parent.parent is None:  # Дочерние элементы в порядке убывания
            return 1
        else:
            return -1

    def sort_recursive(obj):
        if obj.children:
            obj.children.sort(key=compare)
            for child in obj.children:
                sort_recursive(child)

    objects.sort(key=compare)
    for obj in objects:
        sort_recursive(obj)

# Пример использования
obj1 = Object("Object 1")
obj2 = Object("Object 2", parent=obj1)

objects = [obj2, obj1]
sort_objects(objects)

for obj in objects:
    print(obj.name)
```

Этот код будет сортировать список объектов указанного типа в соответствии с вашими требованиями. Начиная с объектов без родителей, затем следуют дочерние элементы в порядке убывания, и объекты без дочерних элементов в конце списка.
сортировка "дерева" не имеет смысла, если вы не делаете проекцию на массив/коллекцию.. <br/> если делаете, то совет <a href="https://qna.habr.com/user/vabka" rel="nofollow">Василий Банников</a> , самодостаточен.. <br/> есть отдельная тема "балансировка деревьев"... применимо ли?... зависит от способа построения и типа дерева
В голову приходит схема сортировки тройки (id родителя; id потомка; название): <br/> - id родителя - id узла-родителя, может быть null <br/> - id потомка - id любого узла-потомка, может быть null <br/> - название - это поле Name (скорее всего сортировка по нему нужна) <br/> <br/> И тогда сравнение будет по соответствующим элементам тройки. <br/> Причем, id родителя и id потомка могут быть null и в таком случае сравнение будет null first (т.е. null больше) и null last (т.е. null меньше) для id родителя и id потомка соответственно. А если равны, то уже по имени (Name) сравниваем. <br/> Вроде бы условия соблюдаются: <br/> - Без родителя первый: id родителя = null - больший вес при сравнении <br/> - Самый последний - объект без дочерних элементов: id потомка = null - больший вес при сравнении <br/> - Дальше по убыванию к дочерним: id - можно как числа сравнивать <br/> <br/> P.S. "дальше по убыванию, к дочерним" не совсем понял, что имеется ввиду
Похожие вопросы