import java.util.Comparator; import java.io.File;
public class FileComparator implements Comparator<File>{ public static final int NAME = 1; public static final int SIZE = 2; public static final int TYPE = 3; public static final int MODIFY = 4; public static final char ASCENDING = 'A'; public static final char DESCENDING = 'D'; private int method; private char order; public FileComparator(){ this.setMethod(FileComparator.NAME); this.setOrder(FileComparator.ASCENDING); } public FileComparator(int method){ this.setMethod(method); this.setOrder(FileComparator.ASCENDING); } public FileComparator(char order){ this.setMethod(FileComparator.NAME); this.setOrder(order); } public FileComparator(int method, char order){ this.setMethod(method); this.setOrder(order); } private void setMethod(int method){ method: switch (method){ case FileComparator.SIZE: case FileComparator.TYPE: case FileComparator.MODIFY:{ this.method = method; } break method; default:{ this.method = FileComparator.NAME; } } } private void setOrder(char order){ order: switch (order){ case FileComparator.DESCENDING:{ this.order = order; } break order; default:{ this.order = FileComparator.ASCENDING; } } } public int compare(File file1, File file2){ int c; method: switch (this.method){ case FileComparator.SIZE:{ order: switch (this.order){ case FileComparator.DESCENDING:{ c = new Long(file2.length() - file1.length()).intValue(); } break order; default:{ c = new Long(file1.length() - file2.length()).intValue(); } } } break method; case FileComparator.TYPE:{ String extension1 = file1.getName(); String extension2 = file2.getName(); String filename1 = null; String filename2 = null; { int last = extension1.lastIndexOf('.'); if (last > -1){ filename1 = extension1.substring(0, last); extension1 = extension1.substring(last + 1); } } { int last = extension2.lastIndexOf('.'); if (last > -1){ filename2 = extension2.substring(0, last); extension2 = extension2.substring(last + 1); } } order: switch (this.order){ case FileComparator.DESCENDING:{ c = extension2.compareTo(extension1) * 1024 + ((filename2 == null) ? 0 : filename2.compareTo(filename1)); } break order; default:{ c = extension1.compareTo(extension2) * 1024 + ((filename1 == null) ? 0 : filename1.compareTo(filename2)); } } } break method; case FileComparator.MODIFY:{ order: switch (this.order){ case FileComparator.DESCENDING:{ c = new Long(file2.lastModified() - file1.lastModified()).intValue(); } break order; default:{ c = new Long(file1.lastModified() - file2.lastModified()).intValue(); } } } break method; default:{ order: switch (this.order){ case FileComparator.DESCENDING:{ c = file2.getName().compareTo(file1.getName()); } break order; default:{ c = file1.getName().compareTo(file2.getName()); } } } } return c; } public String toString(){ return String.format("Method: %s, Order: %s", this.method, this.order); } }
使用 java.util.Arrays.sort() 時, 可讓 File 的類別依照指定的形式排序
如 java.util.Arrays.sort(files, new FileComparator(FileComparator.NAME, FileComparator.ASCENDING)
Use java.util.Arrays.sort() to make File class sort by specific order
For example java.util.Arrays.sort(files, new FileComparator(FileComparator.NAME, FileComparator.ASCENDING)
但需要注意的是 FileComparator.TYPE 的排序方式並非最好的編程方法
However, FileComparator.TYPE is not the best order
沒有留言 :
張貼留言