2016-07-13 2 views
0

Как я могу сортировать по возрастанию/по убыванию группу файлов на основе их имени со следующим соглашением об именах: 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.

Кто-нибудь уже это сделал?

+3

Вам придется проанализировать число, являющееся частью имени файла, и отсортировать его на основе этого, а не естественное упорядочение строк. – Augusto

ответ

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 

UPDATE

Альтернативой, предложенный @dhg

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

уборщик версия ответа J.Romero, используя sortBy:

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

Как я хотел бы использовать самый чистый способ выполнить эту работу, я больше всего интересуюсь вашим методом; но он возвращает 'sorted: List [String]' из-за 'map (_. getName)'. У вас есть обновление для восстановления: 'sorted: List [File]'? – wipman

+1

Обновите ответ рабочей версией предложения @ dhg. – JRomero

Смежные вопросы