首页 > 解决方案 > 在每组格式化字符串中查找最大 wrt 子字符串

问题描述

我正在努力寻找一个场景的解决方案。我的目录中的文件很少。让我们说

vbBaselIIIData_201802_3_d.data.20180405.txt.gz    
vbBaselIIIData_201802_4_d.data.20180405.txt.gz   
vbBaselIIIData_201803_4_d.data.20180405.txt.gz  
vbBaselIIIData_201803_5_d.data.20180405.txt.gz

这里假设第二个下划线之后的单个数字称为runnumber。我必须只选择具有最新运行号的文件。所以在这种情况下,我只需要从四个文件中选择两个并将其放入一个可变的 scala 列表中。ListBuffer 应包含:

vbBaselIIIData_201802_4_d.data.20180405.txt.gz  
vbBaselIIIData_201803_5_d.data.20180405.txt.gz

任何人都可以建议我如何实现这一点。我正在使用 Scala,但也只赞赏算法。我们可以使用哪些正确的数据结构集?我们需要实现哪些功能?有什么建议么。

标签: regexscalascala-collections

解决方案


这是一个希望有点鼓舞人心的提议,它展示了一大堆不同的语言特性和集合上的有用方法:

val list = List(
  "vbBaselIIIData_201802_3_d.data.20180405.txt.gz",
  "vbBaselIIIData_201802_4_d.data.20180405.txt.gz",
  "vbBaselIIIData_201803_4_d.data.20180405.txt.gz",
  "vbBaselIIIData_201803_5_d.data.20180405.txt.gz"
)

val P = """[^_]+_(\d+)_(\d+)_.*""".r
val latest = list
  .map { str => {val P(id, run) = str; (str, id, run.toInt) }}
  .groupBy(_._2)                // group by id
  .mapValues(_.maxBy(_._3)._1)  // find the last run for each id
  .values                       // throw away the id
  .toList
  .sorted                       // restore ordering, mostly for cosmetic purposes

latest foreach println

简要说明您在阅读 Scala 简介时可能遗漏的并非完全无关紧要的部分:

  • "regex pattern".r将字符串转换为已编译的正则表达式模式
  • { stmt1 ; stmt2 ; stmt3 ; ... ; stmtN; result }计算为最后一个表达式result
  • 提取器语法可用于编译的正则表达式模式
  • val P(id, run) = str匹配第二个和第三个_分隔值
  • _.maxBy(_._3)._1str找到具有最高运行次数的三元组,然后再次提取第一个组件

输出:

vbBaselIIIData_201802_4_d.data.20180405.txt.gz
vbBaselIIIData_201803_5_d.data.20180405.txt.gz

推荐阅读