【问题标题】:How do I find the value of the last character of a string for each string in a list>如何找到列表中每个字符串的字符串最后一个字符的值>
【发布时间】:2020-03-13 01:54:40
【问题描述】:

我需要根据条件过滤 List[String]。列表中的每个字符串都以一个数字结尾,我需要过滤这个列表,以便新列表只包含以大于 5 的数字结尾的字符串。我已经采取了很多方法来解决这个问题,这是我能得到的最接近的方法让它工作,但它告诉我存在类型不匹配。

val filteredList = lines.filter(lines.foreach(lines(_).takeRight(1).toInt) > 5)

"lines" 是我要过滤的字符串列表。

所以如果我传入一个列表:

List("word 1", "word 2", "word 3", "word 6", "word 7", "word 8")

那么预期的输出将是:

List("word 6", "word 7", "word 8")

【问题讨论】:

  • 始终提供测试数据和预期输出

标签: scala list filter foreach


【解决方案1】:

好的,这里有一个可能的解决方案:

我也扩展了您的测试数据以包含错误数据:

val lines = List("word 1", "word 2", "word 3", "word 6", "word 7", "word 8", "", "bad")

过滤算法使用Pattern Matching,这里有2种情况。

val filteredList = 
    lines.map(_.reverse.toList)
    .filter{
      case x::_ if Character.isDigit(x) => x.asDigit > 5
      case _ => false
    }.map(_.mkString.reverse)

我反转字符串并将其更改为列表,因此模式匹配更容易。在最后一行我重做了一遍。

如果您绝对确定您的数据始终处于预期的形式,则它是单行的:

lines.filter(_.last.asDigit > 5)

如果数据不正确,您也可以尝试将最后一个字符更改为数字。如果没有,它会失败并且你返回 false。

请注意,有些人认为,您不应该使用异常处理来控制流程。

lines.filter(str =>
  Try(str.last.asDigit > 5).getOrElse(false)  
) 

这里是 Luis Miguel Mejía Suárez 的版本

lines.filter(line => 
   line.lastOption.collect { 
     case char if (char.isDigit) => 
       char.asDigit 
     }.fold(_ > 5)(ifEmpty = false)
)

【讨论】:

  • @LuisMiguelMejíaSuárez 为什么不将其添加为答案 - 很难在评论中进行比较。大多数人在理解collectfold 时遇到问题——我也花了一些时间;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2012-04-18
相关资源
最近更新 更多