2013-08-26 76 views
0

我有groovy中的名稱或節點的映射,其中父主鍵和值取決於父子節點。在Groovy中循環遍歷節點集合

'A' -> 'B', 'C' 
'B' -> 'C' 
'C' -> 'D' 
'D' 

沒有葉子的節點未在地圖中指定爲鍵。

我需要根據它們的級別爲每個節點指定排名。這意味着我想創建新的地圖或改變現有的地方,它將包含從100開始的排名,沒有葉子的節點。

'D' -> 100 
'C' -> 101 
'B' -> 102 
'A' -> 103 

在groovy中做什麼最好的方法是什麼?

謝謝。

回答

0

你可以嘗試這樣的事情(運行在GroovyConsole

//the list of nodes 
def nodes = ['A','B','C','D'] 
//the map of children for each node(children are in lists) 
def children = [A:['B', 'C'],B:['C'],C:['D']] 
//the map for the rankings 
def ranking = [:] 

//define closure first so it can be called recursively 
def calculate 
calculate = { 
    if(children.containsKey(it)){ 
     //if key is in children map it has children -> at least rank 1 
     int rank = 1 
     //get children ranks and put it con collection 
     def childrenRanks = children[(it)].collect{calculate(it)} 
     //add max children rank to parent rank and return 
     return rank + childrenRanks.max() 
    }else{ 
     //if key is not on children map is leaf so rank 0 
     return 0 
    } 
} 

nodes.each{ 
    ranking[it] = 100 //fixed value 
    ranking[it] += calculate(it) 
} 

println ranking 
+0

Alfergon,謝謝。什麼是孩子:孩子?我如何閱讀它? – yart

+1

@yart它是一個地圖構造函數。 Groovy默認提供這些。這意味着:「用'children'變量中的值啓動'children'字段 – Will

+0

@WillP說的是:D這個例子足夠嗎?它能解決你的問題嗎? – Alfergon