Поиск и изменение дубликатов записей в коллекции

70
7

Мне нужно найти и изменить дубликаты записей в коллекции.

Я могу сделать следующее, которое работает, но делает несколько шагов.

Есть ли более чистый способ достичь окончательного результата, указывающего все записи, которые имеют дубликаты?

void "test find and mark duplicate entries"() {
given:
def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]

when:
def duplicateEntries = sports.findAll { sports.count(it) > 1 }.unique()

then:
duplicateEntries == ["basketball", "football"]

when:
sports = sports.collect {
if (duplicateEntries.contains(it)) {
return it + "-dupe"
} else {
return it
}
}

then:
sports == ["baseball", "basketball-dupe", "football-dupe", "basketball-dupe", "basketball-dupe", "football-dupe", "soccer", "volleyball"]
}

спросил(а) 2016-02-19T08:01:00+03:00 4 года, 7 месяцев назад
1
Решение
70

Расширение ответа от @Opal. Этот использует groupBy..

def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]
def groupBy=sports.groupBy ().collect { it.value.size()>1 ? "$it.key-dupe" : "$it.key" }
println( groupBy)

ответил(а) 2016-02-19T11:14:00+03:00 4 года, 7 месяцев назад
79

Такая же сложность, как и другие ответы, более эффективная память ;-)

def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]
sports.collect { sports.count(it) > 1 ? "$it-dupe" : it }

ответил(а) 2016-02-19T11:46:00+03:00 4 года, 7 месяцев назад
70

Следующий фрагмент кода может быть немного короче, но я не ожидал бы чудес здесь;)


def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]
def duplicates = sports.countBy { it }.findAll { it.value > 1 }.keySet()
sports.collect { it in duplicates ? "$it-dupe" : it }

ответил(а) 2016-02-19T10:53:00+03:00 4 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема