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

Как можно оптимальным образом отсортировать список объектов указанного типа таким образом, чтобы объекты без родителя находились в начале списка, затем следовали бы объекты-дочерние элементы в порядке убывания, а объекты без дочерних элементов находились в конце списка?
  • 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)
```

Этот код будет сортировать список объектов указанного типа в соответствии с вашими требованиями. Начиная с объектов без родителей, затем следуют дочерние элементы в порядке убывания, и объекты без дочерних элементов в конце списка.
сортировка "дерева" не имеет смысла, если вы не делаете проекцию на массив/коллекцию.. 
если делаете, то совет Василий Банников , самодостаточен..
есть отдельная тема "балансировка деревьев"... применимо ли?... зависит от способа построения и типа дерева
В голову приходит схема сортировки тройки (id родителя; id потомка; название): 
- id родителя - id узла-родителя, может быть null
- id потомка - id любого узла-потомка, может быть null
- название - это поле Name (скорее всего сортировка по нему нужна)

И тогда сравнение будет по соответствующим элементам тройки.
Причем, id родителя и id потомка могут быть null и в таком случае сравнение будет null first (т.е. null больше) и null last (т.е. null меньше) для id родителя и id потомка соответственно. А если равны, то уже по имени (Name) сравниваем.
Вроде бы условия соблюдаются:
- Без родителя первый: id родителя = null - больший вес при сравнении
- Самый последний - объект без дочерних элементов: id потомка = null - больший вес при сравнении
- Дальше по убыванию к дочерним: id - можно как числа сравнивать

P.S. "дальше по убыванию, к дочерним" не совсем понял, что имеется ввиду
Похожие вопросы