我需要根据条件过滤List [String]。列表中的每个String均以数字结尾,我需要过滤该列表,以便新列表仅包含以大于5的数字结尾的字符串。我已采用多种方法来解决此问题,这是我能得到的最接近的方法使其正常工作,但它告诉我类型不匹配。
val filteredList = lines.filter(lines.foreach(lines(_).takeRight(1).toInt) > 5)
“行”是我要过滤的字符串列表。
因此,如果我传递了一个列表:
List("word 1", "word 2", "word 3", "word 6", "word 7", "word 8")
那么预期的输出将是:
List("word 6", "word 7", "word 8")
好的,这里是一个可能的解决方案:
我还将您的测试数据扩展为包含不良数据:
val lines = List("word 1", "word 2", "word 3", "word 6", "word 7", "word 8", "", "bad")
过滤器算法使用模式匹配,其中有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 MiguelMejíaSuárez的版本:
lines.filter(line =>
line.lastOption.collect {
case char if (char.isDigit) =>
char.asDigit
}.fold(_ > 5)(ifEmpty = false)
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句