使用java数组列表按大小排序目录中的文件

时间:2014-11-25 06:30:35

标签: java collections text-files

该目录有n个文件。我正在创建类,它将使用java arraylist从目录中按大小对文件进行排序。

我可以读取文件名和大小。但是如何按大小对文件进行排序?

    import java.io.File;
    import java.io.FilenameFilter;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;  

    public class SortingFiles
    {
        public static void main(String[] args) 
        {
            File dir=null;
            File[] paths;

            final ArrayList<String> al= new ArrayList<String>();


            try{      
                // create new file object
                dir = new File("D:\\New folder\\New");

                // array of files and directory
                paths = dir.listFiles();


                ArrayList<File> fileList = new ArrayList<File>();


                for(File file:paths)
                {
                    // prints filename and directory name
                    System.out.println(file.getName()+" - " +file.length() );


                    al.add(file.getName());
}


        }
        catch(Exception e)
        {
                        e.printStackTrace();
        }
    }

我试图按大小对文件进行排序

 for(int i=1; i<al.size(); i++)
 {
         System.out.println("\n  Aftr : " +al.get(i) );
  }

但它不起作用..任何人都可以帮助我..我正在尝试没有&#34;导入org.apache.commons.io.FileUtils;&#34;。那该怎么办?

3 个答案:

答案 0 :(得分:2)

name中使用(sizealobject,然后使用自定义Comparator排序(或制作此自定义对象Comparable )使用Collections.sort。类似的东西:

public class FileData implements Comparable<FileData> {
    private final String fileName;
    private final long fileSize;

    public FileData(final String fileName, final long fileSize) {
        this.fileName = fileName;
        this.fileSize = fileSize;
    }

    // getters

    @Override
    public String toString() {
        return (fileName == null ? "" : fileName) + " - " + fileSize;
    }

    @Override
    public int compareTo(FileData other) {
        return Long.compare(fileSize, other.fileSize);
    }
}

然后:

public class SortingFiles
{
    public static void main(String[] args) {
        // ...
        final List<FileData> al = new ArrayList<FileData>();
        // ...
        for (final File file: paths) {
            final FileData fileData = new FileData(file.getName(), file.length());
            System.out.println(fileData);
            al.add(fileData);
        }
        // ...
        Collections.sort(al);
        // ...

未经测试,甚至未编译(此处输入)

答案 1 :(得分:1)

您必须创建一个String long hashmap,然后将key作为文件名,长度和值,然后使用自然顺序按值对hashmap进行排序。

答案 2 :(得分:0)

我已经完成了。谢谢你的帮助。

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;

public class SortingFiles
{
    public static void main(String[] args) 
    {
        File dir=null;
        File[] paths;

        final ArrayList<String> al= new ArrayList<String>();


        try{      
            // create new file object
            dir = new File("D:\\New folder\\New");

            // array of files and directory
            paths = dir.listFiles();


            ArrayList<File> fileList = new ArrayList<File>();

            class Pair implements Comparable 
            {
                public long t;
                public File f;

                public Pair(File file)
                {
                    f = file;
                    t = file.length();
                }

                public int compareTo(Object o) 
                {
                    long u = ((Pair) o).t;
                    return t < u ? -1 : t == u ? 0 : 1;
                }
            };

            Pair[] pairs = new Pair[paths.length];
            for (int i = 0; i < paths.length; i++)
                pairs[i] = new Pair(paths[i]);

            Arrays.sort(pairs);

            // Take the sorted pairs and extract only the file part, discarding the timestamp.
            for (int i = 0; i < paths.length; i++)
                paths[i] = pairs[i].f;



            for(File file:paths)
            {
                // prints filename and directory name
                System.out.println(file.getName()+" - " +file.length() );


                al.add(file.getName());
            }

            //for()

        }
        catch(Exception e)
        {
            // if any error occurs
            e.printStackTrace();
        }
    }
}