Как выполнить цикл по карте и отобразить только одну строку, если есть совпадающие значения

#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]]