How to sort file or folder by filename or date at ascending or descending in Android?

5.4k Views Asked by At

The following sample code is from Internet, I hope to sort the List<String> files by filename at ascending or descending. I hope to the List<String> files by date of file at ascending or descending, how can I do ? Thanks!

The same quetsion with List<String> directories.

  List<String> files = Arrays.asList(f.list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            File f=new File(dir, name);               

            return f.isFile()&&(f.isHidden()==false);
        }
    }));
    Collections.sort(files);




List<String> directories = Arrays.asList(f.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        File f=new File(dir, name);
        return f.isDirectory()&& (f.isHidden()==false);
    }
}));
Collections.sort(directories);
3

There are 3 best solutions below

3
Sohail Zahid On BEST ANSWER

Just provide your File array and it sort simple.

Arrays.sort(files, new Comparator<File>() {
    public int compare(File f1, File f2) {
        return Long.compare(f1.lastModified(), f2.lastModified());
    }
});

Demo:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        File path = Environment.getExternalStoragePublicDirectory("/DCIM/Camera");
        File[] filesList = path.listFiles();
        for (int i = 0; i < filesList.length; i++) {
            Date lastModDate = new Date(filesList[i].lastModified());
            Log.i("Pre sorted", "File last modified @ : " + lastModDate.toString());
        }

        Arrays.sort(filesList, new Comparator<File>() {
            public int compare(File f1, File f2) {
                return Long.compare(f1.lastModified(), f2.lastModified());
            }
        });
        Log.i("sorted", "----------------------------------------");
        for (int i = 0; i < filesList.length; i++) {
            Date lastModDate = new Date(filesList[i].lastModified());
            Log.i("Pro sorted", "File last modified @ : " + lastModDate.toString());
        }
    }
0
jettimadhuChowdary On

You can use like below for sorting based on file name and change that value for date and other comparision. Or simply use ApacheCommons, it will give direct APIs

File[] directoryList = currentFolder.listFiles(); 
if (directoryList != null) {
   List<File> directoryListing = new ArrayList<File>();
   directoryListing.addAll(Arrays.asList(directoryList));
   Collections.sort(directoryListing, new SortFileName());
   Collections.sort(directoryListing, new SortFolder());
}


//sorts based on the files name
public class SortFileName implements Comparator<File> {
    @Override
    public int compare(File f1, File f2) {
          return f1.getName().compareTo(f2.getName());
    }
}

//sorts based on a file or folder. folders will be listed first
public class SortFolder implements Comparator<File> {
    @Override
    public int compare(File f1, File f2) {
         if (f1.isDirectory() == f2.isDirectory())
            return 0;
         else if (f1.isDirectory() && !f2.isDirectory())
            return -1;
         else
            return 1;
          }
}
0
Rachit Vohera On

Might be late to answer bt this method sort files by desc order by modified date

File[] listFile = dir.listFiles();
Arrays.sort(listFile, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Long.compare(o2.lastModified(), o1.lastModified());
            }
        });