查找包含最多“a”字母的字符串

iovurdzv  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(367)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

两天前关门了。
改进这个问题
我有一个问题,如果我能以某种方式缩短我的代码-我需要找到什么字符串在我的名单中包含最多的'a'字母。我做的如下,但我几乎可以肯定,我可以做得更短,但我不知道如何。所以首先我把我的列表Map到tuple,在那里我有 (el, num) 在哪里 num 是“a”包含多少(使用foldleft)。然后我用 maxBy 所以我取一个a字母最多的元素,然后过滤 num == res2._2 (因为可能有多个元素具有相同数量的“a”字母,所以我不能停在 maxBy 我的代码:

def mostA(l: List[String]): List[String] = {

    val res = l.map( string => (string, string.foldLeft(0)((acc,b) => if (b == 'a') acc + 1 else acc)))
    val res2 = res.maxBy(x => x._2)
    val res3 = res.filter(x => x._2 == res2._2).map{case (str, num) => str}
    res3

  }
m4pnthwp

m4pnthwp1#

你的代码已经很小很简洁了。但是,我们可以做一些改进:

def mostLetter(letter: Char)(data: List[String]): List[String] = {
  val counts = data.map(s => s -> s.count(_ == letter))
  val max = counts.maxBy(_._2)._2
  counts.collect {
    case (str, `max`) => str
  }
}

也就是说,我们替换了 foldLeft 在字符串中 count 我们融合在一起 filter + map 在一个 collect 另外,请记住最后一个表达式是返回值,因此没有必要将它赋给变量,以便稍后仅返回它。

busg9geu

busg9geu2#

稍加努力,你就可以一蹴而就:

l.foldLeft(List[String] -> 0) { case ((strs, max), s) => 
       val n = s.count(_ == letter)
       if (n == max) (s::strs, max) else if (n > max) (s::Nil, n) else (strs, max)
    }._1.reverse

相关问题