2016-06-13 79 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