Сортировать связанные объекты с родителем - PullRequest
0 голосов
/ 20 июня 2019

у нас есть списки категорий, где каждая категория может иметь родительское поле, которое является ссылкой на родительскую категорию текущей категории.Можете ли вы сказать мне, что является лучшим алгоритмом в Java для сортировки категорий, например, сверху вниз категории?Спасибо.

@Table
@Entity
public class Category {
     @Id
     Long id;
     @ManyToOne
     Category parent;
}

Пример:

Список:

  • Категория (id = 3, родитель = категория (id = 11))
  • Категория (id = 4, родитель = категория (id = 3))
  • Категория (id = 11, родитель = категория (id = 20, родитель = ноль))

будет отсортировано сверху вниз так:

Категория (id = 20) -> Категория (id = 11) -> Категория (id = 3) -> Категория (id = 4)

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Я не вижу, как здесь происходит сортировка.

  1. Поиск категории, у которой нет родителя
  2. поиск ребенка от него
  3. Перейти к 2

Это дает вам список, который вы хотите.

Примечание:
Если у каждого родителя есть только один ребенок или нет ребенка, вы получите список, как в вашем примере. (или более одного списка), иначе вы получите дерево (или более одного дерева).

В случае «один или нет ребенка» вы можете расширить свою категорию с помощью поля child, что делает ее двойным связанным списком. В этом случае «поиск его потомка» становится тривиальным, поскольку у вас есть прямая ссылка на него.

0 голосов
/ 20 июня 2019

Предположим, у вас есть список. Вы можете отсортировать этот список, используя Collections.sort (); Но ваш класс должен немного измениться, потому что вы должны реализовать Comparable и переопределить метод compareTo (). Это пример, надеюсь, он вам поможет.

public class Category implements Comparable<Category>{
    Long id;
    Category parent;
    // Constructors getters setters
    public int compareTo(Category aux){
       // Assuming you want to sort by parent's id, and I understand a category
       // maybe doesn't have parent it may be null
       if(aux.getParent() != null && this.parent != null){
           if(aux.getParent().getId() > this.parent.getId()) return -1;
           else if(aux.getParent().getId() < this.parent.getId()) return ;
           return 0;
       }
       if(aux.getParent() == null && this.parent.getId() == null) return 0;
       if(aux.parent() == null) return 1;
       return 0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...