Kotlin泛型Tree的add函数compare参数如何传参
Kotlin泛型Tree的add方法compare参数传入说明
方法完整实现如下:
fun add ( value : A, compare : (A, A) -> Int ) : Tree <A> = when (this) { is Empty -> treeNode(value) is Node -> if (compare(value,this.value) < 1) { treeNode(this.value,left.add(value,compare),right) } else{ treeNode(this.value,left,right.add(value,compare)) } }
compare参数规则
第二个参数是接收两个A类型参数、返回Int值的比较函数,返回值遵循通用比较器约定:
- 第一个参数小于第二个参数时,返回负整数
- 第一个参数等于第二个参数时,返回0
- 第一个参数大于第二个参数时,返回正整数
结合方法逻辑,当compare(新插入值, 当前节点值) < 1时,新值会被插入到左子树,否则插入到右子树,默认遵循左小右大的排序逻辑。
调用示例
以你提到的tree.add(5, ?)场景(此时泛型A为Int类型),第二个参数有以下几种常见传法:
- 传Lambda表达式实现自然升序(Kotlin语法支持:如果Lambda是方法的最后一个参数,可以移到括号外部)
// 按数值从小到大排序,小值存左子树,大值存右子树 tree.add(5) { a, b -> a - b }
- 如果需要降序排序,反转比较逻辑即可
// 按数值从大到小排序,大值存左子树,小值存右子树 tree.add(5) { a, b -> b - a }
- 传已有函数引用,比如Int类型自带的compareTo方法
tree.add(5, Int::compareTo)
如果Tree存储的是自定义类型,只需在Lambda中实现对应字段的比较逻辑即可,比如存储User对象按年龄排序:
data class User(val age: Int, val name: String) val userTree: Tree<User> = Empty() userTree.add(User(22, "Jack")) { a, b -> a.age - b.age }
内容的提问来源于stack exchange,提问作者funnylookingcode
相关产品推荐
相关产品推荐

