Получить только уникальные значения из массива - PullRequest
3 голосов
/ 12 апреля 2019

У меня есть массив массивов, и мне нужно получить только уникальные значения empname и dept из этого массива без зависимости от hoursWorked.

def data = [[empname:'Test1',dept:10,hoursWorked:6],            
        [empname:'Test1',dept:10,hoursWorked:2],
        [empname:'Test2',dept:10,hoursWorked:10]] as Set

println data;

Я использовал Set, чтобы он содержалтолько уникальные ценности.Поскольку hoursWorked отличается, я получаю все три значения.

Я хочу, чтобы ожидаемый результат был:

[[empname:Test1, dept:10],[empname:Test2, dept:10]]

Ответы [ 3 ]

3 голосов
/ 12 апреля 2019

Вы можете преобразовать список карт в набор карт, но сначала вам нужно преобразовать список, чтобы он содержал только интересующие вас записи на карте. Рассмотрим следующий пример:

data.collect { [empname: it.empname, dept: it.dept] }.toSet()

При первом запуске он преобразует каждую карту в карту, содержащую только два ключа, а после этого преобразует список в набор, поэтому он содержит только уникальные пары empname и dept.

*.1007 * Выдает ожидаемый результат:
[[empname:Test1, dept:10], [empname:Test2, dept:10]]
2 голосов
/ 12 апреля 2019

Да, это не сработает, поскольку значения отличаются.

Вы можете написать закрытие сравнения для ваших данных и передать его в unique

Будьте осторожны, так как unique мутирует исходный список

def data = [
    [empname:'Test1',dept:10,hoursWorked:6],            
    [empname:'Test1',dept:10,hoursWorked:2],
    [empname:'Test2',dept:10,hoursWorked:10]
]

println data.unique { a, b -> a.empname <=> b.empname ?: a.dept <=> b.dept }
// Prints: [[empname:Test1, dept:10, hoursWorked:6], [empname:Test2, dept:10, hoursWorked:10]]

println data
// Prints: [[empname:Test1, dept:10, hoursWorked:6], [empname:Test2, dept:10, hoursWorked:10]]
// Original collection was mutated
1 голос
/ 12 апреля 2019

Вы можете использовать уникальный с закрытием, возвращая значения, которые основаны только на ключах, которые вы хотите использовать:

data.unique{[it['empname'], it['dept']]}
===> [[empname:Test1, dept:10, hoursWorked:6], 
      [empname:Test2, dept:10, hoursWorked:10]]

data.unique{[it['empname'], it['dept']]} позволит Groovy вычислить коллекцию различных значений только на основе ключей empname и dept. Вам решать сбросить ключи hoursWorked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...