目标是从数据列表中返回具有给定参数的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中建议解决方案。
答案 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)
}
}
}