我有这样一个代码,一般来说它是正确的,但如果有一个最大的长词,它后面是相同的词的长度,那么它将返回只有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) }
}
字符串
我假设这可以用reduce来完成,但我不太明白怎么做,可能我的实现需要重做,因为maxBy不允许这样做,如果可能的话,修复我的代码或提供你的解决方案。这是一个学习任务,它涉及到使用函数而不是集合。
2条答案
按热度按时间a8jjtwal1#
maxBy
查找第一个出现的最大元素,而不是最后一个。如果你想要最后一个最大值元素,你可以在 reversing(
asReversed
)从split
得到的字符串列表后简单地执行maxBy
。考虑使用
maxByOrNull
而不是maxBy
,这样当用户没有输入任何内容时,您将得到null
而不是异常。另外,我不知道你为什么要用这个来做一个Map。这是不必要的。你也不应该把
let { println(...) }
的结果赋给val
。那是Unit
对象,而不是你想要的结果。如果你想将结果存储在某个地方并打印出来,可以使用
also
:字符串
1cklez4t2#
你可以这样修改你的代码:
字符串
reduce
用于遍历单词列表。currentWord
)与迄今为止找到的最长单词的长度(longestWord
)进行比较。