#groovy
#groovy
Вопрос:
У меня есть массив массивов, и мне нужно получать только уникальные значения 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]]
Ответ №1:
Вы можете преобразовать список карт в набор карт, но сначала вам нужно преобразовать список, чтобы он содержал только интересующие вас элементы карты. Рассмотрим следующий пример:
data.collect { [empname: it.empname, dept: it.dept] }.toSet()
При первом запуске он преобразует каждую карту в карту, содержащую только два ключа, а после этого преобразует список в набор, поэтому он содержит только уникальные пары empname
и dept
.
Он выдает ожидаемый результат:
[[empname:Test1, dept:10], [empname:Test2, dept:10]]
Ответ №2:
Да, это не сработает, поскольку значения разные.
Вы можете написать замыкание сравнения для своих данных и передать его 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
Ответ №3:
Вы можете использовать unique с замыканием, возвращающим значения, основанные только на ключах, которые вы хотите использовать:
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
ключей.