在 Java / groovy 中获取 parent 名称
Get parent name in Java / groovy
我正在阅读带有类别树的 table。现在我需要获得一个类别的 name
、id
和 parentname
的输出,但我不知道如何获取 parent 的名称。
def collect(path, item) {
def line = item.id_ShopCOM + "|" + item.parent_guid + "|" + item.caption_ShopCOM
outfile += line +"\n"
println(line )
x++
}
这样我可以获得 parent_guid (Database ID)
,但是如何在这个循环中访问 parent 的名称?
由于循环迭代只处理一项,因此访问 parent 数据的唯一方法是进行查找。您可以根据需要进行查找 on-the-fly,或者查找数据 pre-processed.
这是一个 Groovy-only 模拟。你有一个项目列表,基本上是你从数据库中得到的。它被实现为 List<Map>
.
def tree = [
[id: 1, parent: 3, name: 'root'],
[id: 2, parent: 4, name: 'john'],
[id: 3, parent: null, name: '/'],
[id: 4, parent: 3, name: 'home']
]
上面的示例数据是 *NIX 目录 /、/root、/home 和 /home/john。
查找将按项目 ID,Map
的一个很好的候选者。所以 List<Map>
被转换为 Map<Map>
.
def treeMap = tree.inject([:]) {map, item ->
map[item.id] = item - [id: item.id]
map
}
Map
看起来像这样:
[
1:[parent:3, name:'root'],
2:[parent:4, name:'john'],
3:[parent:null, name:'/'],
4:[parent:3, name:'home']
]
现在您可以选择是进行 parent 查找 on-the-fly 还是从 pre-processed Map
.
On-the-fly
通过 on-the-fly 查找,您只需遍历 treeMap
并在每次迭代中使用相同的 treeMap
查找 parent 的数据。
treeMap.each {id, item ->
println "$id|$item.parent|$item.name|${treeMap[item.parent]?.name}"
}
Pre-processed地图
使用 pre-processed Map
基本上是用 parent 的数据替换 parent 的 ID。警告,您可能必须将 ID 放回原处。
treeMap = treeMap.collectEntries {id, item ->
def parent = treeMap[item.parent]
if(parent) parent.id = item.parent // Putting the ID back in.
def newItem = item << [parent: parent]
[(id): newItem]
}
treeMap.each {id, item ->
println "$id|${item.parent?.id}|$item.name|${item.parent?.name}"
}
输出
无论哪种方式,输出都是一样的:
1|3|root|/
2|4|john|home
3|null|/|null
4|3|home|/
我正在阅读带有类别树的 table。现在我需要获得一个类别的 name
、id
和 parentname
的输出,但我不知道如何获取 parent 的名称。
def collect(path, item) {
def line = item.id_ShopCOM + "|" + item.parent_guid + "|" + item.caption_ShopCOM
outfile += line +"\n"
println(line )
x++
}
这样我可以获得 parent_guid (Database ID)
,但是如何在这个循环中访问 parent 的名称?
由于循环迭代只处理一项,因此访问 parent 数据的唯一方法是进行查找。您可以根据需要进行查找 on-the-fly,或者查找数据 pre-processed.
这是一个 Groovy-only 模拟。你有一个项目列表,基本上是你从数据库中得到的。它被实现为 List<Map>
.
def tree = [
[id: 1, parent: 3, name: 'root'],
[id: 2, parent: 4, name: 'john'],
[id: 3, parent: null, name: '/'],
[id: 4, parent: 3, name: 'home']
]
上面的示例数据是 *NIX 目录 /、/root、/home 和 /home/john。
查找将按项目 ID,Map
的一个很好的候选者。所以 List<Map>
被转换为 Map<Map>
.
def treeMap = tree.inject([:]) {map, item ->
map[item.id] = item - [id: item.id]
map
}
Map
看起来像这样:
[
1:[parent:3, name:'root'],
2:[parent:4, name:'john'],
3:[parent:null, name:'/'],
4:[parent:3, name:'home']
]
现在您可以选择是进行 parent 查找 on-the-fly 还是从 pre-processed Map
.
On-the-fly
通过 on-the-fly 查找,您只需遍历 treeMap
并在每次迭代中使用相同的 treeMap
查找 parent 的数据。
treeMap.each {id, item ->
println "$id|$item.parent|$item.name|${treeMap[item.parent]?.name}"
}
Pre-processed地图
使用 pre-processed Map
基本上是用 parent 的数据替换 parent 的 ID。警告,您可能必须将 ID 放回原处。
treeMap = treeMap.collectEntries {id, item ->
def parent = treeMap[item.parent]
if(parent) parent.id = item.parent // Putting the ID back in.
def newItem = item << [parent: parent]
[(id): newItem]
}
treeMap.each {id, item ->
println "$id|${item.parent?.id}|$item.name|${item.parent?.name}"
}
输出
无论哪种方式,输出都是一样的:
1|3|root|/
2|4|john|home
3|null|/|null
4|3|home|/