在Java / groovy中获取父名称

时间:2015-10-12 08:13:05

标签: groovy categories

我正在阅读一个带有类别树的表。现在我需要获得一个类别为nameidparentname的输出,但我无法弄清楚如何获取父级的名称。

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),但是如何在此循环中访问父级的名称?

1 个答案:

答案 0 :(得分:1)

由于循环迭代只处理一个项目,因此访问父项数据的唯一方法是进行查找。您可以根据需要随时进行查找,也可以预先处理查找数据。

这是一个仅限Groovy的模拟。你有一个项目列表,基本上你从数据库中获得了什么。它实现为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']
]

现在,您可以选择是在运行中还是从预处理Map进行父查找。

的On-the-飞

使用即时查找,您只需遍历treeMap,并在每次迭代中使用相同的treeMap查找父项的数据。

treeMap.each {id, item ->
    println "$id|$item.parent|$item.name|${treeMap[item.parent]?.name}"
}

预处理地图

使用预处理的Map,您基本上将父母的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|/