Получать только уникальные значения из массива

#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 ключей.