按名称排序文件

时间:2016-07-13 15:24:32

标签: scala sorting

如何根据名称以升序/降序对一组文件进行升序/降序排序,具有以下命名约定:myPath\numberTheFileInt.ext

我想获得以下内容:

myPath\1.csv
myPath\02.csv
...
myPath\21.csv
...
myPath\101.csv

这就是我现在所拥有的:

myFiles = getFiles(myFilesDirectory).sortWith(_.getName < _.getName)

尽管文件在目录中排序,但它们在myFiles中未排序。 我有输出:

myPath\1.csv
myPath\101.csv
myPath\02.csv
...
myPath\21.csv

我尝试了多项内容,但总是抛出NoSuchElementException

有没有人这样做过?

2 个答案:

答案 0 :(得分:1)

比较字符串将根据要比较的字符串的unicode值产生一个顺序。您需要的是根据整数提取文件编号和顺序。

import java.io.File

val extractor = "([\\d]+).csv$".r

val files = List(
  "myPath/1.csv",
  "myPath/101.csv",
  "myPath/02.csv",
  "myPath/21.csv",
  "myPath/33.csv"
).map(new File(_))


val sorted = files.sortWith {(l, r) =>
  val extractor(lFileNumber) = l.getName
  val extractor(rFileNumber) = r.getName

  lFileNumber.toInt < rFileNumber.toInt
}

sorted.foreach(println)

结果:

myPath/1.csv
myPath/02.csv
myPath/21.csv
myPath/33.csv
myPath/101.csv

<强>更新

@dhg提出的备选方案

val sorted = files.sortBy { f => f.getName match {
  case extractor(n) => n.toInt
}}

答案 1 :(得分:1)

J.Romero答案的清洁版,使用sortBy

val Extractor = "([\\d]+)\\.csv".r
val sorted = files.map(_.getName).sortBy{ case Extractor(n) => n.toInt }