Kotlin(语法跟java类似)中处理组织层级关系的递归方法
在组织结构中,我们经常需要处理层级关系,例如公司内部的部门结构、学校中的班级结构等。这些结构通常具有树形特点,其中每个节点可能包含多个子节点。在Kotlin中,我们可以通过编写递归函数来处理这种层级关系,并根据需要更新节点的属性。
下面是一个示例代码,展示了如何使用Kotlin编写一个递归函数来处理组织结构的层级关系。
首先,我们有一个从数据库查询得到的原始记录列表。每条记录都是一个包含组织信息的MutableMap<String, Any>
对象。这些记录可能包含组织的代码、父组织代码、层级等字段。
表结构
kotlin代码
syncSql =
select org_code as org_code ,org_name as org_name ,parent_code as parent_code from p_org
var records = commonDAO.selectEntityBySql(syncSql, null)
接下来,我们根据业务需求对记录进行处理。在这个例子中,我们需要构建每个组织的级联代码、更新层级,并确定是否有子组织。为此,我们编写了一个名为preDealRecords
的递归函数。
private fun preDealRecords(obj: MutableMap<String, Any>, list: MutableList<MutableMap<String,Any>>, result: MutableList<MutableMap<String,Any>>) {
// 提取关键信息
val superOrgCode = obj["PARENT_CODE"] ?: obj["parent_code"]
val tempCode: String = obj["TEMP_CODE"].toString()
val cascade = obj["ORG_CASCADE"].toString()
val level = obj["ORG_LEVEL"].toString().toInt()
// 处理根组织
if (null == superOrgCode) {
result.add(obj)
return
}
// 遍历所有记录查找父组织
for (org in list) {
val dataOrgCode = org["ORG_CODE"] ?: org["org_code"]
val dataParentCode = org["PARENT_CODE"] ?: org["parent_code"]
if (tempCode.equals(dataOrgCode)) {
// 更新当前组织的级联代码和层级
obj.put("ORG_CASCADE", "$dataOrgCode,$cascade")
obj.put("ORG_LEVEL", level + 1)
// 递归处理父组织
if (null == dataParentCode) {
result.add(obj)
return
} else {
obj.put("TEMP_CODE", dataParentCode.toString())
preDealRecords(obj, list, result)
}
}
}
}
在preDealRecords
函数中,我们首先提取当前记录的关键信息,然后判断它是否是根组织。如果是根组织,我们将其添加到结果列表中,并结束递归。否则,我们遍历整个记录列表,查找当前记录的父组织。当我们找到父组织时,我们更新当前记录的级联代码和层级,并递归地处理父组织。这个过程会一直进行,直到我们找到根组织或者遍历完所有记录。
最后,我们将处理后的记录列表赋值给原始的records
变量,以便后续使用。
private fun hasChildRen(orgCode: String, list: MutableList<MutableMap<String,Any>>): Boolean {
for (obj in list) {
val parentCode = obj["PARENT_CODE"] ?:obj["parent_code"]
if (null != parentCode) {
if (orgCode == parentCode.toString()) {
return true
}
}
}
return false
}
if (CarrierEnums.SyncSingleType.ORG == type) {
var result: MutableList<MutableMap<String, Any>> = mutableListOf()
val initLevel = 1
for (record in records) {
// 初始化或更新记录的字段
record.put("ORG_CASCADE", record["ORG_CODE"] ?: record["org_code"])
record.put("ORG_LEVEL", initLevel)
record.put("HAS_CHILDREN", hasChildRen(record["ORG_CODE"] as String, records))
record.put("TEMP_CODE", if (null == record["PARENT_CODE"]) "ROOT" else record["PARENT_CODE"].toString())
// 处理记录并更新结果列表
preDealRecords(record, records, result)
}
records = result
}
通过这种方式,我们可以构建出完整的组织层级关系,并轻松地获取每个组织的级联代码、层级以及是否有子组织等信息。这对于构建复杂的组织结构图、实现权限控制等功能非常有用。
在实际应用中,我们还可以根据具体需求对代码进行扩展和优化,例如添加错误处理机制、使用更高效的数据结构等。通过灵活运用Kotlin的语言特性,我们可以编写出高效且易于维护的代码来处理复杂的层级关系。