Как найти дубликаты в массиве и вывести?

Есть массив строк - ("C", "A", "B", "B", "G", "A", "C", "H", "A", "F", "F", "F", "C", "F")

Нужно найти количество дубликатов у оригинала.

Выхлоп должен быть в виде списка объектов, где у объекта есть два поля - буква оригинала и массив дубликатов:

С -> С, С

A -> A,A

B -> B

F -> F,F,F

Чтобы это сделать я прохожусь по всему списку и сравниваю первый элемент с каждым остальным и если есть совпадение, то сохраняю в отдельный объект дубликат вместе с оригиналом, а сам дубликат удаляю из списка. Когда доходим до конца, то удаляем также и первый элемент, чтобы лишний раз не проходиться по списку и приступить к следующим буквам, которые остались. Остальные буквы без дубликатов в конечный массив не добавляется. До тех пор пока изначальный массив не закончится

Но вместого нужного результата получается такой выхлоп:

C [C, C]

A [A, A]

B [B]

F [F]

C [C]

data class Result(var orig : String, var dup : MutableList<String>)

val list = mutableListOf("C", "A", "B", "B", "G", "A", "C", "H", "A", "F", "F", "F", "C", "F")
        val listResult = mutableListOf<Result>()

        while (list.size > 0) {
            val tempList = mutableListOf<String>()
            tempList.addAll(list)

            val result = Result(list[0], mutableListOf())

            tempList.forEachIndexed { index, value ->
                if (index == 0 && tempList.size > 1) return@forEachIndexed
                if (tempList[0] == value) {
                    result.dup.add(value)
                    list.removeAt(index)
                }
            }

            if (list.size > 0) list.removeAt(0)

            if (result.dup.isNotEmpty()) {
                listResult.add(result)
            }
        }

        listResult.forEach {
            Log.d("Result", "!!! "+it.orig +" " +it.dup.toString())
        }

Ответы (2 шт):

Автор решения: Сергей Бувака

Вы можете создать HashMap где ключом будет ваше строка, а значением список ваших строк.

И проходите по вашему списку и если такой ключ уже есть то просто добавляете в список ещё одну строку, если нет то добавляете новый ключ

→ Ссылка
Автор решения: Drawn Raccoon
data class Result(var orig: String, var dup: MutableList<String>)

fun main() {

    val list = mutableListOf("C", "A", "B", "B", "G", "A", "C", "H", "A", "F", "F", "F", "C", "F")
    val result = list.groupingBy { it }.aggregate { key, accumulator: Result?, element, first ->
        when {
            first -> Result(key, mutableListOf())
            else -> accumulator!!.apply { dup.add(element) }
        }!!
    }.values.filter { it.dup.isNotEmpty() }

    println(result) // [Result(orig=C, dup=[C, C]), Result(orig=A, dup=[A, A]), Result(orig=B, dup=[B]), Result(orig=F, dup=[F, F, F])]
}
→ Ссылка