Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 将列表分为连续相同对象的列表_Kotlin - Fatal编程技术网

Kotlin 将列表分为连续相同对象的列表

Kotlin 将列表分为连续相同对象的列表,kotlin,Kotlin,假设我有一个函数,它将字符列表收集到所有连续相同字符的列表中: [a, a, b, a, b, b, b, c, c, c, c] -> [[a, a], [b], [a], [b, b, b], [c, c, c, c]] 我的解决方案是手动填充ArrayList,如下所示: fun foo(chars: List<Char>): List<List<Char>> { val result = arrayListOf<ArrayLis

假设我有一个函数,它将字符列表收集到所有连续相同字符的列表中:

 [a, a, b, a, b, b, b, c, c, c, c] -> [[a, a], [b], [a], [b, b, b], [c, c, c, c]]
我的解决方案是手动填充ArrayList,如下所示:

fun foo(chars: List<Char>): List<List<Char>> {
    val result = arrayListOf<ArrayList<Char>>()
    var part = arrayListOf(chars.first())
    var cur = chars.first()
    for (char in chars.drop(1)){
        if (cur == char) part.add(char)
        else {
            cur = char
            result.add(part)
            part = arrayListOf(char)
        }
    }
    if(part.isNotEmpty()) result.add(part)
    return result
}
然而,这看起来非常不雅观,所以我认为一定有更好的方法来做到这一点。有什么想法吗?

您可以使用groupBy[function][1]:

val chars = listOf('a', 'a', 'b', 'a')

val result = chars.groupBy { it } // Map<Char,List<Char>> = ['a' to ['a','a'], 'b' to ['b']]
您可以使用groupBy[function][1]:

val chars = listOf('a', 'a', 'b', 'a')

val result = chars.groupBy { it } // Map<Char,List<Char>> = ['a' to ['a','a'], 'b' to ['b']]

作为一个选项,在一行中转换

fun main(args: Array<String>) {

    val list = arrayListOf('a', 'a', 'b', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c')
    val result = "(\\w)\\1*".toRegex().findAll(list.joinToString("")).map { it.value.toCharArray() }.toList()

    for (arr in result) {
        print(arr.contentToString()) // prints [a, a][b][a][b, b, b][c, c, c, c]
    }

}

作为一个选项,在一行中转换

fun main(args: Array<String>) {

    val list = arrayListOf('a', 'a', 'b', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c')
    val result = "(\\w)\\1*".toRegex().findAll(list.joinToString("")).map { it.value.toCharArray() }.toList()

    for (arr in result) {
        print(arr.contentToString()) // prints [a, a][b][a][b, b, b][c, c, c, c]
    }

}

关闭,不幸的是不完全是我所寻找的,因为这将把所有相同的字符分组到列表中,而不仅仅是连续的:[a,a,b,b,b,c,c,c]>[[a,a,a],[b,b,b,b,b],[c,c,c,c]]关闭,不幸的是不完全是我所寻找的,因为这将把所有相同的字符分组到列表中,而不仅仅是连续的:[a,a,b,a,b,b,c,c,c]>[a,a,a],[b,b,b,b],[c,c,c]]我不认为有一个内置函数可以很好地处理这个问题。好吧,你也许可以尝试使用fold,但你最终可能会得到比你当前的解决方案更难理解的东西。我建议创建一个扩展函数fun List.foo:List,它可以让你执行不雅观的解决方案我不认为有一个内置函数可以很好地处理这个问题。好吧,你也许可以尝试使用fold,但最终你可能会得到一些比当前解决方案更难理解的东西。我建议创建一个扩展函数fun List.foo:List,它可以让你执行用一种优雅的方式描述这个不雅观的解决方案。我在寻找一个更通用的解决方案,但我想我并没有具体说明。Regex是解决这个问题的一个非常聪明的解决方案。不过有一个提示:你可以使用Regex\\w\\1*而不是\\w\\1*我认为它会精确地内联到Regexbla bla中,所以sameI正在寻找一个更通用的解决方案解决方案,但我想我并没有真正指定。Regex是解决这个问题的一个非常聪明的解决方案。不过有一个提示:您可以使用Regex\\w\\1*而不是\\w\\1*。我认为它将完全内联到Regexbla bla中,所以它是一样的