목록

2011-02-25 4 views
5

나가도록지도 채울 필요목록

  • 키가 문자열
  • 가치는 것은

과정은 이동하는 것입니다 문자열의 목록입니다 두 개의 텍스트 필드 인 "매개 변수"와 "값"이있는 테이블의 모든 레코드를 통해. "매개 변수"는 고유하지 않으며 많은 중복이 있습니다. 그래서 내가하려는 의도는 다음과 같습니다.

def all = MyTable.findAll() 
def mymap = [:] 

all.each { 
    // add to mymap the element "it.value" to the list that has "it.parameter" as key 
} 

실마리가 있습니까?

감사

답변

9

:

all = [ 
    [parameter: 'foo', value: 'aaa'], 
    [parameter: 'foo', value: 'bbb'], 
    [parameter: 'bar', value: 'ccc'], 
    [parameter: 'baz', value: 'ddd'] 
] 

def myMap = [:].withDefault { [] } 
all.each { 
    myMap[it.parameter] << it.value 
} 

assert myMap.size() == 3 
assert myMap.foo == ['aaa','bbb'] 
assert myMap.bar == ['ccc'] 
assert myMap.baz == ['ddd'] 
+1

Groovy 1.8 이상에서는 다음과 같은'all.groupBy {it.parameter} .collectEntries {k, v –

+0

또한 Groovy 1.8 이전에는 다음을 할 수 있습니다 :'all.groupBy {it.parameter} .inject ([:]) {> ([k] : v *. map, val -> map << [(val.key) : val.value * .value]}' –

+0

그러나 위의 내용이 더 읽기 쉽다고 가정합니다. –

6

당신은 폐쇄 전달을 기반으로 그룹의지도로 컬렉션을 분할 할 Map.groupBy 방법을 사용할 수 있습니다. 다음은 각 매개 변수 지점에 바로 값을 만들기 위해 수집 호출하는 전체 예제입니다 :

그루비 1.7에 도입 된 'withDefault'을 사용하여이 일을 이럴 조금 더 간단한 방법이있다
all = [ 
    [parameter: 'foo', value: 'aaa'], 
    [parameter: 'foo', value: 'bbb'], 
    [parameter: 'bar', value: 'ccc'], 
    [parameter: 'baz', value: 'ddd'] 
] 
tmpMap = all.groupBy{it.parameter} 
myMap = [:].putAll(tmpMap.collect{k, v -> [k, v.value] as MapEntry}) 

assert myMap == [foo: ['aaa', 'bbb'], bar: ['ccc'], baz:['ddd']] 
+4

+1 내 대답보다 훨씬 낫습니다. 자바로 그루비 코드 ... 멋진 일을하지는 않지만, 일자리를 얻는다. – hvgotcodes