在 Java / groovy 中获取 parent 名称

Get parent name in Java / groovy

我正在阅读带有类别树的 table。现在我需要获得一个类别的 nameidparentname 的输出,但我不知道如何获取 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|/