Как вставить элементы в список элементов без большого количества итераций - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть dataClass, который содержит уникальный code элемент, код родительского элемента и два списка - categories и subcategories.

data class MyItem (
        var code: String,
        var name: String,*
        var data: String,
        var count: Int,
        var parent: String,
        var categories: MutableList<MyItem>,
        var subcategories: MutableList<MyItem>
)

Я получил с сервера 3 разных списка предметов.И структура, которую я хочу получить:

- listOfTopLevelItems
--- listOfMiddleLevelItems
----- listOfBottomLevelItems

, где каждый topLevelItem содержит список middleLevelItems, а каждый элемент среднего уровня содержит список элементов нижнего уровня.Для этого я использовал код ниже

                for (topItem in topLevelItems) {
                    for (middleItem in middleLevelItems) {
                        if (topItem.code == middleItem.parent) {
                            val middleResultItem = middleItem

                            for (bottomItem in bottomLevelItems) {
                                if (middleItem.code == bottomItem.parent) {
                                    middleResultItem.subcategories.add(bottomItem)
                                }
                            }

                            topItem.categories.add(middleResultItem)
                        }
                    }

                    result.add(topItem)
                }

Но проблема в том, что если у меня будет много элементов на нижнем уровне, чем будет много итераций.Есть ли другой способ решить эту проблему?

1 Ответ

0 голосов
/ 10 апреля 2019

Итак, у вас есть DAG глубины 3. Я собираюсь внести некоторые другие корректировки, помимо решения вашей итерационной задачи.

Во-первых, я думаю, что структура ваших классов данных немного избыточна для описания графа объектов. Вам не нужны поля категории и подкатегории, на мой взгляд. Удаляя ненужные поля, вот как бы выглядело мое:

data class MyItem(
        var code: String,
        var parent: String? = null,
        var categories: MutableList<MyItem> = mutableListOf()
){
    val subcategories: List<MyItem>
        get() = categories.flatMap { it.categories }

}

Корневым / верхним элементом будет любой элемент, родитель которого равен нулю. И тогда его категории - его непосредственные дети, а его подкатегории - его внуки. Я предоставил здесь свойство, которое будет заботиться о внуках, если вы действительно хотите этот метод доступа, и это означает, что если вы добавите что-то к ребенку, внуки родителей будут обновлены автоматически: D.

Теперь для версии 1 создания графа объектов. Это держит вещи в соответствии с вашей очевидной структурой знания, какие из них являются корнями, детьми и внуками. Но это не нужно, как вы увидите в версии 2.

fun main() {
    val topItems = listOf(MyItem("1"), MyItem("2"))
    val middleItems = listOf(MyItem("1_1", "1"), MyItem("1_2", "1"), MyItem("2_1", "2"))
    val bottomItems = listOf(MyItem("1_1_1", "1_1"), MyItem("1_2_1", "1_2"), MyItem("2_1_1", "2_1"))

    val topByID = topItems.map { it.code to it }.toMap()
    val middleByID = middleItems.map { it.code to it }.toMap()

    bottomItems.forEach { middleByID[it.parent]?.categories?.add(it) }
    middleItems.forEach { topByID[it.parent]?.categories?.add(it) }

    println(topItems)
    println(topItems[0].subcategories)
}

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

fun main() {
    val topItems = listOf(MyItem("1", "*"), MyItem("2", "*"))
    val middleItems = listOf(MyItem("1_1", "1"), MyItem("1_2", "1"), MyItem("2_1", "2"))
    val bottomItems = listOf(MyItem("1_1_1", "1_1"), MyItem("1_2_1", "1_2"), MyItem("2_1_1", "2_1"))

    val allItems = topItems + middleItems + bottomItems
    val allItemsByID = allItems.map { it.code to it }.toMap()

    allItems.forEach {
        allItemsByID[it.parent]?.categories?.add(it)
    }

    println(topItems)
    println(topItems[0].subcategories)
}

Это мой любимый подход: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...