kotlin 在Map中查找最长单词的问题

toiithl6  于 11个月前  发布在  Kotlin
关注(0)|答案(2)|浏览(134)

我有这样一个代码,一般来说它是正确的,但如果有一个最大的长词,它后面是相同的词的长度,那么它将返回只有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不允许这样做,如果可能的话,修复我的代码或提供你的解决方案。这是一个学习任务,它涉及到使用函数而不是集合。

a8jjtwal

a8jjtwal1#

maxBy查找第一个出现的最大元素,而不是最后一个。
如果你想要最后一个最大值元素,你可以在 reversingasReversed)从split得到的字符串列表后简单地执行maxBy
考虑使用maxByOrNull而不是maxBy,这样当用户没有输入任何内容时,您将得到null而不是异常。
另外,我不知道你为什么要用这个来做一个Map。这是不必要的。你也不应该把let { println(...) }的结果赋给val。那是Unit对象,而不是你想要的结果。
如果你想将结果存储在某个地方并打印出来,可以使用also

val result = readlnOrNull()
    ?.split(" ")
    ?.asReversed()
    ?.maxByOrNull { it.length }
    ?.also { println(it) }

字符串

1cklez4t

1cklez4t2#

你可以这样修改你的代码:

fun main() {
    val result = readLine()?.split(" ")
        ?.reduce { longestWord, currentWord ->
            if (currentWord.length >= longestWord.length) currentWord else longestWord
        }
    println(result?.get(0))
}

字符串

  • reduce用于遍历单词列表。
  • 对于每个单词,它将当前单词的长度(currentWord)与迄今为止找到的最长单词的长度(longestWord)进行比较。
  • 如果当前单词的长度等于或长于目前为止找到的最长单词,则它将成为新的最长单词。这样,如果有多个单词的最大长度相同,则将选择最后一个单词。
  • 最后,它打印找到的最后一个最长单词的第一个字符。

相关问题