列表中最长的单词

4
我有一个包含字符串的列表,我想从中打印出最长的字符串。
我尝试使用reduceLeft选项,但每当我使用它时,它都会返回此错误:
type mismatch; found:String required:Ordering[?]

以下是在第二行抛出异常的代码:

val input2 = List("one", "two", "three", "four", "five")
for (entry <- input2.reduceLeft(_ max _)) println(input2.max)

我删除了问题的大部分内容,因为它们似乎不相关。如有需要,请随时恢复。 - Jens Schauder
没有必要回退,现在看起来更好、更紧凑!谢谢! - bajro
2个回答

12

你应该问自己:一个字符串列表的最大值是什么?List[String].maxString.max需要更多澄清它们的任务。

  1. 使用List.maxBy代替List.reduceLeft

input2.maxBy(_.length)
  • 使用隐式类型转换

  • implicit def string2ordering(s: String) = s.length
    input2.max
    

    4

    在Scala中,通常有很多选项。我能想到的最简单的方法是使用maxBy,就像@user925723建议的那样。

    val input2 = List("one", "two", "three", "four", "five")
    
    println(
      input2.maxBy(_.length)
    )
    

    maxBy返回集合中的最大值,但您需要定义所谓的最大值是什么。 "最大的"字符串可以由其在字母表中的位置、它在文学作品中第一次出现的时间或者像你这样由它的长度来定义。Scala不知道,所以您需要告诉它,通过提供转换为具有标准排序(例如int)的东西。

    如果您想要使用reduceLeft,可以使用以下方法:

    println(
      input2.reduce(
        (a, b) =>
          if (a.length < b.length)
            b
          else
            a
      )
    )
    

    那么,你的方法有哪些问题:

    1. 我不确定你使用的是哪个max函数,但它可能按字母顺序比较字符串。

    2. reduceLeft返回集合元素类型的值。这将是一个字符串。如果你遍历一个字符串,你遍历的是字符串的字符,而不是你想要的内容。

    3. 最后,对于字符串的每个字符,你都会打印出集合的最大值。

    4. 实际上,我不确定编译器异常的原因是什么,可能是max正在寻找某个隐式转换为具有Ordering的内容,但我不太确定。

    这就带来了第三种变体:定义一个隐式转换为Ordering,然后使用max。

    implicit def string2ordering(s : String) = s.length
    println(
      input2.max
    )
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接