Groovy 查找和修改集合中的重复项

Groovy 查找和修改集合中的重复项,groovy,Groovy,我需要查找和修改集合中的重复条目 我可以做以下工作,这很有效,但需要几个步骤 是否有一种更干净的方法来实现最终输出,指示所有具有重复项的条目 void "test find and mark duplicate entries"() { given: def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]

我需要查找和修改集合中的重复条目

我可以做以下工作,这很有效,但需要几个步骤

是否有一种更干净的方法来实现最终输出,指示所有具有重复项的条目

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

下面的代码可能会稍微短一点,但我不希望在这里出现奇迹;)


从@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)

与其他答案一样复杂,只是内存效率更高;-)


检查或这是否有帮助。不起作用:最后一个断言将失败。你失去了顺序,最终列表的大小与预期列表的大小不一样。这是简洁明了的(好的,在阅读相关文档后请直截了当)。必须是公认的答案。太棒了,谢谢!我不得不稍微修改它以使测试通过,因为collect不会修改原始集合,但这比我所做的要简单得多
sports=sports.collect{sports.count(it)>1?“$it dupe”:it}
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)
def sports = ["baseball", "basketball", "football", "basketball", "basketball", "football", "soccer", "volleyball"]
sports.collect { sports.count(it) > 1  ? "$it-dupe" : it }