Переопределение сравнения для объекта, ссылающегося на себя (родительская / дочерняя связь)

#sorting #grails #compareto

#сортировка #grails #сравнение

Вопрос:

Я пытаюсь реализовать compareTo в классе домена в grails, чтобы я мог вернуть SortedSet. Я хочу, чтобы мой отсортированный набор упорядочивался по родительскому имени, а затем по «дочернему» имени. Например (P = родительский, C = дочерний):

  • P-1
    • C-1
    • C-2
  • P-2
    • C-3
    • C-4

Мой класс выглядит примерно так:

 class Issue implements Comparable {
 String name
 Issue parent

@Override
public int compareTo(obj){
  if(obj.parent!=null amp;amp; this.parent!=null){
   parent.name.compareTo(obj.parent.name)
  }else{
      //What do I compare to sort the children relative to their parents?
  }
}
 

Ответ №1:

Если все, что вы ищете, — это отсортированные наборы, достаточно ли просто реализовать Comparable по проблеме и использовать порядок сортировки в сопоставлениях?

 class Issue implements Comparable {
 String name
 Issue parent
 SortedSet children

 static hasMany = [children : Issue]
 static belongsTo = [parent : Issue]
 static mapping = {
    sort 'name'
    children sort:'name'
 }    

@Override
public int compareTo(obj){
  if(obj){
    this.name?.compareTo(obj.name)
  }
}
 

Комментарии:

1. Спасибо за ваше предложение! Когда я попробовал это, я получил исключение NullPointerException — parent равно null по крайней мере для одного экземпляра. Я могу написать пользовательский SQL-запрос, чтобы делать то, что я хочу, но не мог понять, как это сделать в HQL.

2. Ой, мой плохой, я имел в виду this.name вместо того , чтобы parent.name .

3. Хм, на самом деле… что делать, если существует более одного уровня вложенности родитель / потомок? Только что создан экземпляр 3-го уровня (т.Е. дочерний элемент), и ваша реализация, похоже, упорядочивает его до самого верха — есть предложения?

4. Хм, не уверен, что я понимаю «до самого верха», можете ли вы привести пример? Также я понял, что hasMany и belongsTo отсутствуют, поэтому добавил их.

5. Спасибо, Калеб! Мой класс уже содержит свойство hasMany, поэтому… Если я добавил, скажем, SC-1 в качестве дочернего элемента в C1, его порядок будет помещен в качестве первого элемента в наборе. Надеюсь, это прояснит ситуацию. Мне еще предстоит попробовать рекурсивное решение с вашим предложением