复杂文件名排序java_Java实现的中文文件名排序

本文介绍了一个使用Java实现的文件排序工具类`FileSorter`,该类提供了多种排序方式,包括按文件修改时间(升序和降序)、文件大小(升序和降序)以及文件名(使用中文排序)。类中利用`Collator.getInstance(java.util.Locale.CHINA)`确保了中文文件名的正确排序。此外,还包含了测试代码来展示如何对文件进行排序并打印结果。
摘要由CSDN通过智能技术生成

中文字符串排序肯定要用到中文排序的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{

/**默认排序的方式, 按目录,文件排序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 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() );

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值