遍历嵌套列表以按指定参数返回内部列表

时间:2018-11-22 01:29:32

标签: java algorithm kotlin depth-first-search breadth-first-search

目标是从数据列表中返回具有给定参数的Object内部列表。将在其上找到该对象的层可能会有所不同。

对象的伪代码是

class Object {
   var id: Int
   var innerObjects: ArrayList<Object>
}  

如果innerObjects参数为null,那么我们到达了叶子。

我们得到ArrayList<Object>,它是我们要搜索的数据,id。我们搜索的对象可以在列表的任何级别。

我现在拥有的是这段代码,但是它仅检查列表的2个级别。请提出一个适用于列表中任意数量级别的解决方案。可能带有递归。

private fun getObject(data: ArrayList<Object>, id: Int): ArrayList<Object> {
        var result = ArrayList<Object>()
        for (i in 0 until data.size) {
            if (data[i].id == id) {
                result = data[i].innerObjects
            } else {
                for (j in 0 until data[i].innerObjects.size) {
                    if (data[i].innerObjects[j].id == id) {
                        result = data[i].innerObjects[j].innerObjects
                    }
                }
            }
        }
        return result
    }

顺便说一句,代码在Kotlin中,但是随时可以在 Kotlin或Java中建议解决方案。

3 个答案:

答案 0 :(得分:0)

因此,在这种情况下,使用基本递归将解决此问题,但请注意,因为这种搜索可以快速产生文字StackOverflowException

fun getInnerObjectsById(nodes: ArrayList<Object>, id: Int) : ArrayList<Object>? {
    nodes.forEach{
        val ans = solve(it, id)
        if (ans != null) return ans
    }
    return null
}

fun getInnerObjectsById(obj: Object?, id: Int): ArrayList<Object>? {
    if (obj?.id == null || obj.innerObjects == null) return null
    if (obj.id == id) return obj.innerObjects
    return obj.innerObjects?.mapNotNull {
        solve(it, id)
    }?.firstOrNull()
}

这是一个涉及更多但必须执行的搜索。

fun getInnerObjectsById(data: ArrayList<Object>, id: Int): ArrayList<Object>? {
    var activeList: List<Object> = data
    while (true) {
        val match = activeList.firstOrNull { it.id == id }
        if (match != null) return match.innerObjects
        activeList = activeList.flatMap { it.innerObjects ?: emptyList<Object>() }

        if (!activeList.isNotEmpty())
            return null
    }
}

答案 1 :(得分:0)

我已经为解决方案编写了Java代码:

ArrayList<TreeNode> solve(TreeNode treeNode, int id) {
    if(treeNode == null) return null;
    if(treeNode.id == id) return treeNode.nodes;
    if(treeNode.nodes == null) return null;
    ArrayList<TreeNode> ans = null, temp = null;
    for(TreeNode t: treeNode.nodes) {
        temp = solve(t, id);
        if(temp != null) ans = temp;
    }
    return ans;
}

关于Ideone的演示:https://ideone.com/cMmAqD

答案 2 :(得分:0)

我为有兴趣的人在Kotlin申请的解决方案!

private fun getObjectById(item: Object, id: Int): ArrayList<Object>? {
    if (item.id == id) return item.innerObjects
    for (child in item.innerObjects) {
        val temp = getObjectById(child, id)
        if (temp!!.isNotEmpty()) return temp
    }
    return ArrayList()
}

fun combineLists(data: ArrayList<Object>?, id: Int) {
    for (j in 0 until data.size) {
         getObjectById(data[j], id)?.let {
            result.clear()
            result.addAll(it)
         }
    }
}