Как пройти по карте и отобразить только одну строку, если есть совпадающие значения - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть карта с разными ключами и несколькими значениями. Если между разными ключами есть какое-либо совпадающее задание, я должен отобразить только одну строку и значения кода группировки.

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

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Следующий код (который использует ваш пример данных):

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 для сбора кодов из соответствующих заданий.

2 голосов
/ 25 апреля 2019

Сначала выровняйте все соответствующие карты, чтобы у них был только плоский список всех из них, а затем в основном то же самое, что и другие, предложенные: группируйте по заданию и просто сохраняйте коды (через оператор распространения)

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 голосов
/ 24 апреля 2019

Вы можете использовать методы коллекции groovy.

Сначала вам нужно извлечь списки, так как вам не нужен ключ элемента верхнего уровня

def jobs = data.values()

Затем вы можете использоватьМетод groupBy для группировки по ключу "job"

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] 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...