代码之家  ›  专栏  ›  技术社区  ›  Lester

如何在Kotlin中使用唯一的增量键对值进行分组?

  •  0
  • Lester  · 技术社区  · 6 年前

    例如,我有这样的列表:

    {{1,"a"},{2,"a"},{3,"b"},{4,"b"},{5,"b"},{6,"a"},{7,"a"},{8,"a"}}
    

    如果我用Kotlin's groupBy { it.value } 然后会是这样的:

    {
       a: = {1,2,6,7,8},
       b: = {3,4,5}
    }
    

    但我想这样分组:

    {
       a1: = {1,2},
       b1: = {3,4,5},
       a2: = {6,7,8}
    }
    

    我应该使用什么Kotlin函数?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Willi Mentzel user670265    6 年前

    给定一个 List (因为命令很重要) Pair<Int, String> 这样地:

    val list = listOf(1 to "a", 2 to "a", 3 to "b", 4 to "b", 5 to "b", 6 to "a", 7 to "a", 8 to "a")
    

    你可以这样做:

    fun groupCount(list: List<Pair<Int, String>>): Map<String, List<Int>> {
        val countMap = mutableMapOf<String, Int>()
        var currentStr = list.firstOrNull()?.second ?: return emptyMap()
    
        return list.map { (key, value) ->
    
            if(currentStr != value) {
                currentStr = value
                countMap[value] = ((countMap[value] ?: 0) + 1)
            }
    
            key to value + countMap.getOrPut(value, {1})
        }.groupBy ({it.second}, {it.first})
    }
    

    最后科特琳 groupBy 当你需要转动它时变得特别方便

    [(1,a1),(2,a1),(3,b1),(4,b1),(5,b1),(6,a2),(7,a2),(8,a2)]

    进入这个:

    a1=[1,2],b1=[3,4,5],a2=[6,7,8]


    如果你碰巧有一个 Map<Int, String> 你可以打电话 toList() 在你把它传给 groupCount .

        2
  •  1
  •   s1m0nw1    6 年前

    我想这是一个非常特殊的用例。一个不太实用的实现可能如下所示:

    fun subgroups(data: Map<Int, String>): Map<String, List<Int>> {
        if (data.isEmpty()) throw IllegalArgumentException()
        val counter = data.values.toSet().associateWithTo(mutableMapOf()){ 1 }
        var last = data.values.first()
        val result = mutableMapOf<String, List<Int>>()
        data.forEach { k, v ->
            if (v != last) {
                counter[last] = counter.getOrDefault(last, 0) + 1
                last = v
            }
    
            "$v${counter[v]}".let { key ->
                result[key] = result.getOrDefault(key, listOf()) + k
            }
        }
        return result
    }
    

    我希望这对你有用