2015-05-21 64 views
1

一個新的動態命名名單上有一個項目列表,看起來像這樣items = ["a", "b", "c"]Groovy創建

我也有值的列表,看起來像這樣values = ["a1", "a2", "a3", "b1", "b2", "c1", "c2", "c3"]

items列表是靜態的,但我的values列表會經常改變。

我的代碼看起來像這樣

for(z=0;z<items.size();z++){ 
    for(i=0;i<values.size();i++){ 
     if(values[i] =~ items[z]){ 
      println value[i] 
     } 
    } 

我真正想要做的就是添加value[i]到名爲items[z],東西的清單,將功能類似${"items[i]"} += value[i]和代碼將它讀成a += value[1]b += value[1]所以對等通過我的循環,所以在最後我會做這樣的事情

assert a == ["a1", "a2", "a3"] 
assert b == ["b1", "b2"] 
assert c == ["c1", "c2", "c3"] 

是否有可能做這樣一個動態命名變量?

+0

您是否試過'Map'?例如。 http://stackoverflow.com/questions/12236743/map-with-key-as-string-and-value-as-list-in-groovy – Vartlok

+0

我看着使用一張地圖,我更多地研究它,它可能會在路上有用。我一直在假設我可以做一個動態命名的變量,因爲我可以在java中這樣做,所以它是我的代碼的最後一塊。如果我需要增加的功能,我將不需要做太多的改變,所以我會研究它。 – pcort

回答

2

您可以動態地添加變數,但你需要使用this(爲您設置的變量對象的實例),例如:

this."${items[i]}" += value[i] 

這應該給你你所需要的東西,或者至少指出你在正確的方向。

+0

完美工作,謝謝! – pcort

1

至於我undesrtand代碼應該是這樣的:

def map = [:] 
for(z=0;z<items.size();z++){ 
    for(i=0;i<values.size();i++){ 
     if(values[i] =~ items[z]){ 
      if (map[values[i]] == null) { 
       map[values[i]] = [] 
      } 
      map[values[i]].add(items[z]) 
     } 
    } 
} 

assert map[values[0]] == ["a1", "a2", "a3"] 
assert map[values[1]] == ["b1", "b2"] 
assert map[values[2]] == ["c1", "c2", "c3"] 
0

如果你接受一個事實,即輸出將是一個地圖,這裏是一個基於eachfindAll關閉另一種方法:

def items = ["a", "b", "c"] 
def values = ["a1", "a2", "a3", "b1", "b2", "c1", "c2", "c3"] 

def result = [:] 
items.each{i-> 
    result.put(i, values.findAll{v->v.startsWith(i)}) 
} 
println result; //[a:[a1, a2, a3], b:[b1, b2], c:[c1, c2, c3]] 
0

groupBy是你的朋友:

def groups = values.groupBy { v -> 
    items.find { i -> v =~ i } 
} 
assert groups.a == ['a1', 'a2', 'a3'] 
assert groups.b == ['b1', 'b2'] 
assert groups.c == ['c1', 'c2', 'c3'] 

一點題外話我強烈建議你給Groovy's excellent List/Map comprehension一個徹底的看看;我可以保證,一旦你明白了,你將不再需要在代碼中使用for循環。