java 文件排序

知識點
1.數組可以直接排序,不用轉換爲ArrayList。
java.util.Arrays.sort(T[] a, Comparator<? super T> c)
2.利用Comparator接口,我們可以方便的設計自己的排序規則。
Comparator接口裏就一個函數,int compare(T o1, T o2)
返回值有三個, 0, -1, 1 
分別表示,相等,小於和大於
3.中文字符串如何排序
中文字符串排序肯定要用到中文排序的Comparator,幸運的是,java有提供這樣的Comparator。
獲取方法
Collator.getInstance(java.util.Locale.CHINA);

下面是,自己封裝的一個文件排序的類,有四種排序方法。

package com.test;

import java.io.File;
import java.sql.Date;
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;

public class FileSorter implements Comparator<File>{
    
/**默認排序的方式, 按目錄,文件排序TYPE_DIR*/
    
public static final int TYPE_DEFAULT             = -1;
    
/**按修改時間,降序*/
    
public static final int TYPE_MODIFIED_DATE_DOWN = 1;
    
/**按修改時間,升序*/
    
public static final int TYPE_MODIFIED_DATE_UP    = 2;
    
/**按文件大小,降序*/
    
public static final int TYPE_SIZE_DOWN            = 3;
    
/**按文件大小,升序*/
    
public static final int TYPE_SIZE_UP            = 4;
/*  public static final int TYPE_NAME_DOWN            = 5;
    public static final int TYPE_NAME_UP            = 6;
*/
    
/**按文件名*/
    
public static final int TYPE_NAME                 = 5;
    
/**按目錄,文件排序*/
    
public static final int TYPE_DIR                = 7;
    
    
private int mType = -1;
    
    
public FileSorter(int type) {
        
if (type < 0 || type > 7) {
            type 
= TYPE_DIR;
        }
        mType 
= type;
    }
    @Override
    
public int compare(File object1, File object2) {
        
        
int result = 0;
        
        
switch (mType) {
        
        
case TYPE_MODIFIED_DATE_DOWN://last modified date down
            result = compareByModifiedDateDown(object1, object2);
            
break;
            
        
case TYPE_MODIFIED_DATE_UP://last modified date up
            result = compareByModifiedDateUp(object1, object2);
            
break;
            
        
case TYPE_SIZE_DOWN:    // file size down
            result = compareBySizeDown(object1, object2);
            
break;
            
        
case TYPE_SIZE_UP:        //file size up
            result = compareBySizeUp(object1, object2);
            
break;
            
        
case TYPE_NAME:            //name 
            result = compareByName(object1, object2);
            
break;
            
        
case TYPE_DIR:            //dir or file
            result = compareByDir(object1, object2);
            
break;
        
default:
            result 
= compareByDir(object1, object2);
            
break;
        }
        
return result;
    }
    
private int compareByModifiedDateDown(File object1, File object2) {
        
        
long d1 = object1.lastModified();
        
long d2 = object2.lastModified();
        
        
if (d1 == d2){
            
return 0;
        } 
else {
            
return d1 < d2 ? 1 : -1;
        }
    }
    
private int compareByModifiedDateUp(File object1, File object2) {
        
        
long d1 = object1.lastModified();
        
long d2 = object2.lastModified();
        
        
if (d1 == d2){
            
return 0;
        } 
else {
            
return d1 > d2 ? 1 : -1;
        }
    }
    
private int compareBySizeDown(File object1, File object2) {
        
        
if (object1.isDirectory() && object2.isDirectory()) {
            
return 0;
        }
        
if (object1.isDirectory() && object2.isFile()) {
            
return -1;
        }
        
if (object1.isFile() && object2.isDirectory()) {
            
return 1;
        }
        
long s1 = object1.length();
        
long s2 = object2.length();
        
        
if (s1 == s2){
            
return 0;
        } 
else {
            
return s1 < s2 ? 1 : -1;
        }
    }
    
private int compareBySizeUp(File object1, File object2) {
        
        
if (object1.isDirectory() && object2.isDirectory()) {
            
return 0;
        }
        
if (object1.isDirectory() && object2.isFile()) {
            
return -1;
        }
        
if (object1.isFile() && object2.isDirectory()) {
            
return 1;
        }
        
        
long s1 = object1.length();
        
long s2 = object2.length();
        
        
if (s1 == s2){
            
return 0;
        } 
else {
            
return s1 > s2 ? 1 : -1;
        }
    }
    
private int compareByName(File object1, File object2) {
        
        Comparator
<Object> cmp = Collator.getInstance(java.util.Locale.CHINA);
        
        
return cmp.compare(object1.getName(), object2.getName());
    }
    
private int compareByDir(File object1, File object2) {
        
        
if (object1.isDirectory() && object2.isFile()) {
            
return -1;
        } 
else if (object1.isDirectory() && object2.isDirectory()) {
            
return compareByName(object1, object2);
        } 
else if (object1.isFile() && object2.isDirectory()) {
            
return 1;
        } 
else {  //object1.isFile() && object2.isFile()) 
            return compareByName(object1, object2);
        }
    }
    
//for test
    public static void main(String[] args){
         
        File[] list 
= new File("/usr").listFiles();
        Arrays.sort(list, 
new FileSorter(FileSorter.TYPE_SIZE_UP));
        printFileArray(list);
    }
    
//for test
    private static void printFileArray(File[] list) {
        
        System.out.println(
"文件大小\t\t文件修改日期\t\t文件類型\t\t文件名稱");
        
        
for (File f : list) {
            System.out.println(f.length() 
+ "\t\t" + new Date(f.lastModified()).toString() + "\t\t" + (f.isDirectory() ? "目錄" : "文件"+ "\t\t" +  f.getName() );
        }
    }
    
}

文章引用自:
http://www.blogjava.net/Green-nut/articles/348307.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章