如何根据名称以升序/降序对一组文件进行升序/降序排序,具有以下命名约定: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
。
有没有人这样做过?
答案 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 }