如何知道树kotlin中的最小叶节点

How to know minimum leaf node in tree kotlin

嘿,我正在研究 kotlin 树数据结构。我想知道哪个叶节点值具有最低价格率值。我的整个列表是按排序顺序排列的。但我无法弄清楚,我怎么知道哪个叶子是最小节点。我将向您展示小示例,因为我有更大的数据。

当我指向 parent 时,我有几个 children 节点,它们的值是按排序顺序排列的,但问题是上面有一些价格,我想知道哪个是最小的整个列表正在发送到我的适配器 android。所以我不明白在哪里可以找到最小节点。当我创建节点或其他地方时?

                                    2


                    |          |         |          |

value->             1          2         3          4

price value->     4.38        5.8       3.2        6.7

LevelIndex.kt

open class LevelIndex(
    var value: String? = null,
    var children: MutableList<LevelIndex> = arrayListOf()
)  

LevelOne.kt

class LevelOne : LevelIndex() {
}

LevelTwo.kt

class LevelTwo : LevelIndex() {
}

Main.kt

var baseNode: LevelIndex = LevelIndex()

fun main() {
    val list = getUnSortedDataListForLevel() // this retrun ProductLevel Data Class value
    val tempHashMap: MutableMap<String, LevelIndex> = mutableMapOf()
    list.forEach { levelClass ->

        levelClass.levelA?.let { levelA ->
            val levelOneTempHashMapNode = tempHashMap["level_a${levelClass.levelA}"]
            if (levelOneTempHashMapNode != null) {
                return@let
            }
            val tempNode = LevelOne().apply {
                value = levelA
            }
            val parent =
                tempHashMap["level_a${levelClass.levelA}"] ?: baseNode
            parent.children.add(tempNode)
            tempHashMap["level_a${levelClass.levelA}"] =
                tempNode
        }
        levelClass.levelB?.let { levelB ->
            val tempNode = LevelTwo().apply {
                value = levelB
            }
            val parent =
                tempHashMap["level_a${levelClass.levelA}"]
                    ?: baseNode
            parent.children.add(tempNode)
        }
    }
}

当我指向 2 值时,我的 children 值为 1、2、3、4。有人可以建议我吗?

UPDATE我忘了添加数据class

ProductLevel.kt

data class ProductLevel(
    val id: String? = null,
    val levelA: ProductValue? = null,
    val levelB: ProductValue? = null,
    val price: ProductValue? = null
)

ProductValue.kt

data class ProductValue(
   val value: String? = null,
)

我的数据是这样的

ProductLevel(id= "1", levelA= ProductLevel("2"), levelB= ProductLevel("1"), price= "4.38")

ProductLevel(id= "2", levelA= ProductLevel("2"), levelB= ProductLevel("2"), price= "5.8")

ProductLevel(id= "3", levelA= ProductLevel("2"), levelB= ProductLevel("3"), price= "3.2")

ProductLevel(id= "4", levelA= ProductLevel("2"), levelB= ProductLevel("4"), price= "6.7")

添加此行后出现奇怪的错误

val result = currentItem.asFlatIterable().minByOrNull(LevelIndex::price)

我不确定我是否完全理解。但是如果你想搜索整棵树,因为 price 属性 可能出现在任何级别,你可以使用 iterator 构建器创建一个平面 Iterable,然后在其上使用熟悉的集合运算符.这个 Iterable 可以重复用于许多目的来搜索你的树。使用 iterator 生成器创建它的好处是它不必分配一个足够大的列表来一次引用树的所有节点。

(我创建它的方式是使用 iterator 构建器,它使用一个挂起函数将值懒惰地产生给 SequenceScope。iterator 的 lambda 是一个受限协程,所以内部我创建的递归函数必须使用 SequenceScope 作为参数,这样编译器就不会抱怨我们违反了协程的限制。)

fun LevelIndex.asFlatIterable() = Iterable {
    iterator {
        suspend fun SequenceScope<LevelIndex>.yieldChildren(parent: LevelIndex) {
            for (child in parent.children) {
                yield(child)
                yieldChildren(child)
            }
        }
        yieldChildren(this@asFlatIterable)
    }
}

为了能够以这种方式按价格搜索,price 需要是共享父 class LevelIndex 上的 属性。

val result = root.asFlatIterable().minByOrNull(LevelIndex::price)

asFlatIterable() 可用于各种用途。您可以将所有节点与某个 filter()map 匹配到一个平面列表等