2015-03-18 3 views
-1

У меня есть список имен файлов, которые называются 0.jpg,1.jpg и т. Д., И я хочу заказать их по убыванию, но, похоже, у меня возникли проблемы с этим. Кроме того, я заметил, что порядок возрастания не совсем, как я хочу, вот пример:Сортировка списка Java по имени (целые числа)

file 1.jpg 
file 10.jpg 
file 100.jpg 
file 101.jpg 
... 
file 109.jpg 
file 11.jpg 

Так что мой вопрос, как я могу сделать заказ нисходящего, но правильно? Вот что им я сейчас делаю:

Collections.sort(files, new Comparator<File>() { 
       @Override 
       public int compare(File s1, File s2) { 
        return s1.getName().compareToIgnoreCase(s2.getName()); 
       } 
      }); 
+2

http://stackoverflow.com/questions/104599/sort-on-a-string-that-may- содержать-a-number и http://www.davekoelle.com/alphanum.html – user370305

+0

@ user370305 ваш коммент привел меня к ответу, пожалуйста, отправьте свой ответ, чтобы я мог его принять. –

+0

Ничего дополнительного ответа. :) Happy Coding .. :) – user370305

ответ

2

Try (работает только если файлы имели один и тот же шаблон имени, т.е.: 'file xxx.jpg')

Collections.sort(files, new Comparator<File>() { 
       @Override 
       public int compare(File s1, File s2) { 
        int f1 = Integer.parseInt(s1.getName().replace("file ", "").replace(".jpg","")); 
        int f2 = Integer.parseInt(s2.getName().replace("file ", "").replace(".jpg","")); 
        return f1 > f2?-1:(f1==f2?0:1); 
       } 
      }); 
+0

Я думаю, это должно сработать, но ответ был в комментарии от @ user370305 Спасибо! –

0

File.getName() возвращающую String, очевидно, так это упорядочение (1, затем 10, затем 100). Вам нужно извлечь числовую часть из строки (например, используя регулярное выражение), проанализировать целое число, если оно есть (например, если длина захваченной подстроки больше нуля) и сравнить целые числа.

0

Вы должны разобрать имена файлов перед вызовом метода Попробуйте это:

Arrays.sort(fileArray, new Comparator<File>() { 
public int compare(File file1, File file2) { 
    try { 
     int i = Integer.parseInt(file1.getName()); 
     int j = Integer.parseInt(file2.getName()); 
     return i - j; 
    } catch(NumberFormatException e) { 
     throw new AssertionError(e); 
    } 
} }); 
Смежные вопросы