查找地图中最长单词的问题

die*_*orn 3 kotlin maxby

我有这样的代码,一般来说它工作正常,但是如果有一个最大长单词并且后面跟着长度相同的单词,那么它将只返回1个长单词,而我需要获取最后一个长单词。这就是我的意思,这样的输入:AWord BWord ALongWord BLongWord CLongWord。我的代码将输出 (A)ALongWord,但应该输出 (C)CLongWord,因为它是最新的。

fun main(){
    val result1 = readLine()?.split(" ")?.associateWith { it.length }?.maxBy { it.value }.let{it?.key?.get(0)}.let { println(it) }
}
Run Code Online (Sandbox Code Playgroud)

我认为这可以通过减少来完成,但我不太明白如何,可能我的实现需要重做,因为 maxBy 不允许它完成,如果可能的话,修复我的代码或提供您的解决方案。这是一项学习任务,涉及在集合上使用函数。

Swe*_*per 5

maxBy查找最大元素的第一次出现,而不是最后一次。

如果您想要最后一个最大元素,您可以简单地在反转( ) 从 中获得的字符串列表maxBy后执行此操作。asReversedsplit

考虑使用maxByOrNull而不是这样maxBy,当用户没有输入任何内容时,您会得到一个null替代异常。

另外,我不确定你为什么要以此为基础制作地图。那是不必要的。您也不应该将 的结果分配let { println(...) }给 a val。那是Unit你想要的对象,而不是结果。

如果您想将结果存储在某处并打印它,请使用also

val result = readlnOrNull()
    ?.split(" ")
    ?.asReversed()
    ?.maxByOrNull { it.length }
    ?.also { println(it) }
Run Code Online (Sandbox Code Playgroud)