2016-06-13 83 views
0

我正在研究一段依賴於從Java繼承的'字段'中的值的Groovy腳本。我需要能夠引用這個字段列表(和值)來創建一個可以使用的地圖。我正在用這種「常規」方式掙扎。Groovy收集(?)變量和值來映射

我有什麼訪問(繼承):

dialogPartyASelection_7 = 'Denied' 
dialogPartyBSelection_7 = 'Accepted' 
dialogPartyASelection_6 = 'Denied' 
dialogPartyBSelection_6 = 'Accepted' 
dialogPartyBSelection_5 = 'Denied' 
dialogPartyASelection_5 = 'Accepted' 
dialogPartyBSelection_4 = 'Denied' 
dialogPartyASelection_4 = 'Accepted' 
dialogPartyBSelection_3 = 'Denied' 
dialogPartyASelection_3 = 'Accepted' 
dialogPartyBSelection_2 = 'Denied' 
dialogPartyASelection_2 = 'Accepted' 
dialogPartyBSelection_1 = 'Denied' 
dialogPartyASelection_1 = 'Accepted' 

我試圖讓:

map = [ 
'dialogPartyASelection_7' : 'Denied', 
'dialogPartyBSelection_7' : 'Accepted', 
'dialogPartyASelection_6' : 'Denied', 
'dialogPartyBSelection_6' : 'Accepted', 
'dialogPartyBSelection_5' : 'Denied', 
'dialogPartyASelection_5' : 'Accepted', 
'dialogPartyBSelection_4' : 'Denied', 
'dialogPartyASelection_4' : 'Accepted', 
'dialogPartyBSelection_3' : 'Denied', 
'dialogPartyASelection_3' : 'Accepted', 
'dialogPartyBSelection_2' : 'Denied', 
'dialogPartyASelection_2' : 'Accepted', 
'dialogPartyBSelection_1' : 'Denied', 
'dialogPartyASelection_1' : 'Accepted' ] 

我「設置我自己了」,如下所示(這些列表會在整個腳本被重新使用)

def selectionsPartyA = [], selectionsPartyB = [], selections = [], PostSelections = [], PostChildrenSelections = [], 

PostSelections = [ 
        '7', 
        '6', 
        '5', 
        '4', 
        '3', 
        '2', 
        '1' 
       ]     

// selectionsPartyA 
for (post in PostSelections) { 
    selectionsPartyA += "dialogPartyASelection_"+post 
    } 

// selectionsPartyB 
for (post in PostSelections) { 
    selectionsPartyB += "dialogPartyBSelection_"+post 
    } 
selections.addAll(selectionsPartyB) 
selections.addAll(selectionsPartyA) 

我已經嘗試迭代使用引用列表,但無法引用如預期的'領域'或'價值'。

+0

看起來你只是建立屬性名稱的名單,可以獲取價值,而不是:'getProperty(name)' – Steinar

+0

你想創建一個Map(**我試圖得到:**)從一個實例?(實例有dialogParty [A或B] Selection_X?) – koji

+0

我是試圖創建一個包含實例字段名稱和值的映射。 @Steinar謝謝!這有助於 - 如果你有一個'模式'有效地做到這一點,這將真正幫助我學習:) – lolno

回答

2

是這樣的?

class Test { 
    String dialogPartyASelection_7 = 'Denied' 
    String dialogPartyBSelection_7 = 'Accepted' 
    String dialogPartyASelection_6 = 'Denied' 
    String dialogPartyBSelection_6 = 'Accepted' 
    String dialogPartyBSelection_5 = 'Denied' 
    String dialogPartyASelection_5 = 'Accepted' 
    String dialogPartyBSelection_4 = 'Denied' 
    String dialogPartyASelection_4 = 'Accepted' 
    String dialogPartyBSelection_3 = 'Denied' 
    String dialogPartyASelection_3 = 'Accepted' 
    String dialogPartyBSelection_2 = 'Denied' 
    String dialogPartyASelection_2 = 'Accepted' 
    String dialogPartyBSelection_1 = 'Denied' 
    String dialogPartyASelection_1 = 'Accepted' 
} 

def obj = new Test() 
def propMap = obj.properties as Map 
assert propMap['dialogPartyASelection_5'] == 'Accepted' 
+0

不完全,我有權訪問的信息作爲變量(dialogPartyASelection_7 ='拒絕')我需要能夠動態地創建一個地圖(地圖= [ 'dialogPartyASelection_7':'Denied',dialogPartyBSelection_7 ='Accepted',etc])與所有這些(這些值可以不同,所以我不能以具有值的地圖開始) – lolno

+1

我想什麼@koji試圖建議使用groovy對象上的'properties'屬性來引用父Java對象上存在的所有屬性,然後將它強制爲一個Map。 – mnd

0

感謝你的幫助,以@ Steinar的建議,我已經能夠做到這一點象下面這樣:

def selectionsPartyA = [], selectionsPartyB = [], selections = [], PostChildrenSelections = [], 

PostSelections = ['7','6','5','4','3','2','1']     

// selections 
for (post in PostSelections) { 
    selectionsPartyA += "dialogPartyASelection_"+post 
    selectionsPartyB += "dialogPartyBSelection_"+post 
    } 
selections.addAll(selectionsPartyB) 
selections.addAll(selectionsPartyA) 

dialogPartyASelection_7 = 'Denied' 
dialogPartyBSelection_7 = 'Accepted' 
dialogPartyASelection_6 = 'Denied' 
dialogPartyBSelection_6 = 'Accepted' 
dialogPartyBSelection_5 = 'Denied' 
dialogPartyASelection_5 = 'Accepted' 
dialogPartyBSelection_4 = 'Denied' 
dialogPartyASelection_4 = 'Accepted' 
dialogPartyBSelection_3 = 'Denied' 
dialogPartyASelection_3 = 'Accepted' 
dialogPartyBSelection_2 = 'Denied' 
dialogPartyASelection_2 = 'Accepted' 
dialogPartyBSelection_1 = 'Denied' 
dialogPartyASelection_1 = 'Accepted' 

test = [:] 
for (entry in selections){ 
test.put(entry, getProperty(entry)) 
} 
assert test == [dialogPartyBSelection_7:Accepted, dialogPartyBSelection_6:Accepted, dialogPartyBSelection_5:Denied, dialogPartyBSelection_4:Denied, dialogPartyBSelection_3:Denied, dialogPartyBSelection_2:Denied, dialogPartyBSelection_1:Denied, dialogPartyASelection_7:Denied, dialogPartyASelection_6:Denied, dialogPartyASelection_5:Accepted, dialogPartyASelection_4:Accepted, dialogPartyASelection_3:Accepted, dialogPartyASelection_2:Accepted, dialogPartyASelection_1:Accepted] 
+1

您的第一個for循環可以用'collectMany'替代,第二個用'collectEntries'替換。也不要使用大寫變量,因爲groovy語法分析器遲早會將它們與類相混淆。 – cfrick