Подсчет всех членов FamilyTree

Я работаю над одним из своих первых проектов на Котлине — FamilyTree. У меня есть класс Person, который содержит поля: имя, возраст, мать, отец и множество братьев и сестер. После инициализации всех элементов теперь мне нужно их всех посчитать, и вот моя проблема.

Давайте сделаем проще: забудьте о братьях и сестрах, только отец и мать. Учитывая тот факт, что все элементы связаны ссылками на их мать, отец, я подумал, что лучшим решением будет использование рекурсивной функции. Я проверяю, есть ли у меня мать, если она у меня есть - я увеличиваю счетчик и проверяю, есть ли у ОНА мать, если она есть - я увеличиваю счетчик и проверяю, есть ли у ЕЕ МАТЕРИ мать, если у ЕЕ МАТЕРИ есть отец, ... Делаю некоторые своего рода бинарное дерево поиска. Код его ниже:

class Person(...) {    
  var amountOfAllRelatives = 0

    fun countAmountOfAllRelatives() {
        this.mother?.let {
            amountOfAllRelatives++
            it.countAmountOfAllRelatives()
        }
        this.father?.let {
            amountOfAllRelatives++
            it.countAmountOfAllRelatives()
        }
        this.siblings?.let {
            it.forEach {
                amountOfAllRelatives++
                it.countAmountOfAllRelatives()
            }
        }
    }
}

Не работает - каждый раз результат равен 0, потому что каждый раз, когда я вызываю функцию CountOfAllRelatives, она обнуляет счетчик.

Я создаю объект-компаньон, который добавляет в список каждого нового человека, поэтому его легко сосчитать, но это неправильное решение, потому что этот список не является частью экземпляра, это часть класса.

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

Я добавил эту часть проекта на Github: https://github.com/RomanMetelov/FamilyTree.git< /а>

Спасибо за ваше время и хорошего дня!


person rMetelov    schedule 14.12.2020    source источник


Ответы (1)


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

class Person(...) { 

var amountOfAllRelatives = 0
var listOfRelatives: MutableList<Person> = mutableListOf<Person>()

fun createListRelativesOf(person: Person) {
    //tree traversal, form a list of all relatives and counting of them
    this.mother?.let {
        person.listOfRelatives.add(it)
        person.amountOfAllRelatives++
        it.createListRelativesOf(person)
    }
    this.father?.let {
        person.listOfRelatives.add(it)
        person.amountOfAllRelatives++
        it.createListRelativesOf(person)
    }
    this.siblings?.let {
        it.forEach {
            person.listOfRelatives.add(it)
            person.amountOfAllRelatives++
            it.createListRelativesOf(person)
        }
    }
}

}

Я также зафиксирую изменения в проекте Github.

person rMetelov    schedule 14.12.2020