【问题标题】:Finding strings which contain the most 'a' letters [closed]查找包含最多“a”字母的字符串[关闭]
【发布时间】:2021-07-19 02:58:25
【问题描述】:

我有一个问题,如果我能以某种方式缩短我的代码 - 我需要找到我的列表中的哪些字符串包含最多的 'a' 字母。我如下所示,但我几乎可以肯定我可以做得更短,但我不知道怎么做。 所以首先我将我的列表映射到元组,其中有(el, num),其中num 是“a”包含的数量(使用 foldLeft)。 然后我使用maxBy,所以我取一个具有最多'a'字母的元素,然后过滤num == res2._2 的所有元素(因为可能有多个元素具有相同数量的'一个'字母,所以我不能停在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

  }

【问题讨论】:

  • 欢迎来到 Stack Overflow!由于您的代码已经在运行并且您只是想找到一种改进它的方法,我建议您在Code Review Stack Exchange 上提问,尽管请务必先通过他们的help pages
  • 我投票结束这个问题,因为 OP 的代码已经在工作,只是需要变得更短/更好。我认为这个问题可能属于 Code Review SE。
  • @user 我相信与其关闭它,不如迁移它。
  • @user 我只是将其标记为版主干预解释它应该迁移到codereview.stackexchange.com - 抱歉花了太长时间,我在手机里。
  • @LuisMiguelMejíaSuárez 供将来参考; Code Review 不是 Stack Overflow 的迁移目标。由于 Code Review 从 Stack Overflow 获得了太多不好的建议。因此,只有版主才能迁移问题。

标签: scala functional-programming


【解决方案1】:

您的代码已经非常小巧简洁了。但是,我们可以做一些改进:

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
  }
}

也就是说,我们将 String 中的 foldLeft 替换为 count,并将 filter + map 融合到一个 collect
另外,请记住最后一个表达式是返回,因此没有必要将它分配给一个变量以便稍后返回它。

【讨论】:

  • 真的吗?那么最大值已经返回了吗?我以前不知道,我想我必须退货。顺便提一句。你为什么用collect而不是filter
  • @funnyguy 不确定您对最大值的含义已经返回。 - 我用collect是因为我需要同时filtermap,看我collectcount等于max的元素
  • 我不确定它的性能。 data.groupBy(_.count(_ == letter)).maxBy(_._1)._2 对我来说感觉更简单,但我不知道这是否更好,更复杂。无论如何,我想如果 OP 没有处理太多字符串也没关系。
  • @user 哦,这是一个非常酷的解决方案!它应该比我的类似于 Dima 的性能更好。我建议您将其添加为答案:)
  • 谢谢!我不完全确定这个问题是否适合 Stack Overflow,所以我会要求 OP 在 Code Review 上发帖,看看我是否可以在那里回答。
【解决方案2】:

稍微费点力,一口气就能搞定:

    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

【讨论】:

  • 您应该确保您的代码首先编译。有一些小错误,修复版本见here
  • 很公平。没有人会直接从 SO 复制代码而不修改它(至少他们不应该),但我仍然更喜欢让编译器校对我的代码。我猜是他们自己的。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2014-11-06
  • 2016-03-26
  • 1970-01-01
  • 2017-06-13
  • 2014-08-04
相关资源
最近更新 更多