#groovy
#заводной #groovy
Вопрос:
У меня есть карта с разными ключами и несколькими значениями.Если есть какое-либо совпадающее задание между разными ключами, я должен отобразить только одну строку и значения кода группировки.
def data = ['Test1':[[name:'John',dob:'02/20/1970',job:'Testing',code:51],[name:'X',dob:'03/21/1974',job:'QA',code:52]],
'Test2':[name:'Michael',dob:'04/01/1973',job:'Testing',code:52]]
for (Map.Entry<String, List<String>> entry : data.entrySet()) {
String key = entry.getKey();
List<String> values = entry.getValue();
values.eachWithIndex{itr,index->
println("key is:" key);
println("itr values are:" itr);
}
}
Ожидаемый результат : [job:Testing,code:[51,52]]
Ответ №1:
Сначала выровняйте все соответствующие карты, чтобы у вас был просто единый список всех из них, затем в основном то же самое, что предлагали другие: группируйте по заданию и просто сохраняйте коды (через оператор распространения)
def data = ['Test1':[[name:'John',dob:'02/20/1970',job:'Testing',code:51],[name:'X',dob:'03/21/1974',job:'QA',code:52]], 'Test2':[name:'Michael',dob:'04/01/1973',job:'Testing',code:52]]
assert data.values().flatten().groupBy{it.job}.collectEntries{ [it.key, it.value*.code] } == [Testing: [51, 52], QA: [52]]
Примечание: вопрос будет изменен в соответствии с комментариями из других ответов.
Приведенный выше код предоставит вам задания и их коды.
На данный момент неясно, каким должен быть новый ожидаемый результат.
Ответ №2:
Вы можете использовать методы сбора groovy.
Сначала вам нужно извлечь списки, поскольку вам не нужен ключ элемента верхнего уровня
def jobs = data.values()
Затем вы можете использовать метод groupBy для группировки по ключу «задание»
def groupedJobs = jobs.groupBy { it.job }
Приведенный выше код приведет к следующему результату в вашем примере
[Testing:[[name:John, dob:02/20/1970, job:Testing, code:51], [name:Michael, dob:04/01/1973, job:Testing, code:52]]]
Теперь вы можете получить только коды в виде значений и внести соответствующие изменения, чтобы сделать ключ заданием, с помощью следующей функции сбора
def result = groupedJobs.collect {key, value ->
[job: key, code: value.code]
}
Комментарии:
1. Спасибо за решение. Если мой набор данных имеет другой массив значений для ключа, он не работает. данные def = [‘Test1′:[[name:’John’,dob:’02/20/1970′,job:’Testing’,code:51],[name:’X’,dob:’03/21/1974′,job:’QA’,code:52] ] ‘Тест2’:[имя: ‘Майкл’, доб: ‘01.04.1973’, работа: ‘Тестирование’, код: 52]]
2. @Studentlearner Если ваша проблема не та, о которой вы спрашиваете, как мы должны предложить решение? Пожалуйста, обновите вопрос с вашей реальной проблемой.
Ответ №3:
Следующий код (который использует ваш образец набора данных):
def data = ['Test1':[name:'John', dob:'02/20/1970', job:'Testing', code:51],
'Test2':[name:'Michael', dob:'04/01/1973', job:'Testing', code:52]]
def matchFor = 'Testing'
def result = [job: matchFor, code: data.findResults { _, m ->
m.job == matchFor ? m.code : null
}]
println result
результаты в:
~> groovy solution.groovy
[job:Testing, code:[51, 52]]
~>
при запуске. Он использует метод groovy Map.findResults для сбора кодов из соответствующих заданий.
Комментарии:
1. Если на карте есть несколько значений, как выполнить поиск соответствующего задания: данные определения = [‘Test1′:[[name:’John’,dob:’02/20/1970′,job:’Testing’,code:51],[name:’X’,dob:’03/21/1974′,job:’QA’,code:52]] , ‘Test2’:[имя: ‘Michael’, dob: ’04/01/1973′, задание: ‘Testing’,код:52]]