注:默认将汉字的优先级为5(汉字的话比较汉字拼音的首字母),字符的优先级为4(.字符除外),大写字母的优先级为3,小写字母的优先级为2,数字的优先级为1。
采用直接插入排序算法。另外使用了一个外部的jar包jpinyin-1.1.8.jar下载地址。开头请打上import com.github.stuxuhai.jpinyin.*;
第一步,我们要能够对字符串进行比较大小,然后才能够使用排序算法(对于与两个字符串,前者大于后者返回true,否则返回false)。
public static Boolean compare(String one,String two){//进行比较两个字符串大小one大返回true否则返回false
char[] ones=one.toCharArray();//将字符串转为字符数组
char[] twos=two.toCharArray();
int number;
if(ones.length>twos.length)
{
number=twos.length;
}else{
number=ones.length;
}
for(int i=0;i<number;i++){
int grade_one=getGrade(ones[i]);//对于字符来说根据获取开头设置的优先级,同一优先级进行比较不同优先级直接获得大小
int grade_two=getGrade(twos[i]);
//System.out.println(grade_one);//输出各自的等级
//System.out.println(grade_two);
if(grade_one>grade_two)
{
return true;
}
else{
if(grade_one<grade_two)
{
return false;
}
else{//如果等级相等则在各自的等级内部继续比较
int one_num=ones[i];
int two_num=twos[i];
if(grade_one==5){//当等级都为5时,即都为汉字
one_num=get_First_Pinyin(ones[i]);
two_num=get_First_Pinyin(twos[i]);
if(one_num<two_num)
{
return true;
}else{
if(one_num>two_num)
{
return false;
}
else{
continue;
}
}
}else{
if(grade_one==4){//当等级都为4时表示都为字符,但是默认.字符大于别的字符
if(ones[i]=='.')
{
return true;
}
else{
if(twos[i]=='.')
{
return false;
}else{
continue;
}
}
}else{//当等级为1,2,3是继续比较,且比较方法相同都是比较编码的大小
if(one_num<two_num)
{
return true;
}else{
if(one_num>two_num)
{
return false;
}
else{
continue;
}
}
}
}
}
}
}
return true;
}
public static int get_First_Pinyin(char c)//获取汉字字符的拼音的首字母
{
String[] pinyins=PinyinHelper.convertToPinyinArray(c, PinyinFormat.WITHOUT_TONE);
char[] result=pinyins[0].toCharArray();
//System.out.println(pinyins[0]);//输出整个拼音
//System.out.println(result[0]);//输入拼音的首个字母
int nums=result[0];
return nums;
}
public static int getGrade(char c){//获取字符的优先级
int i=c;
if (i>=19968&&i<=40869)
{return 5;}
else{
if(i>=48&&i<=57)
{
return 1;
}else{
if(i>=97&&i<=122)
{
return 2;
}else{
if(i>=65&&i<=90)
{
return 3;
}
else{
return 4;
}
}
}
}
}
第二步,能够对字符串进行比较以后我们就可以愉快的使用我们的直接插入排序算法了。
public static String[] order(String[] old)//给一个没排序的数组,返回一个排序后的数组
{
String news[]=new String[old.length];
news[0]=old[0];
int n;
for(int i=1;i<old.length;i++)
{
n=1;
while(compare(old[i],news[i-n]))
{
if(i-n==0)
{
n=n+1;
break;
}
n++;
}
int temp1=i;
String temp2=old[i];
for(int j=1;j<n;j++)
{
news[i]=news[i-1];
i=i-1;
}
news[i]=temp2;
i=temp1;
}
return news;
}
}
第三步,我们来看看结果吧
public static void main(String[] args)
{
File f=new File("s:\\hi");
String str[]=f.list();//此处我读取了我电脑上的一个目录
String[] news=order(str);
System.out.println("----=排序前-----");
for(int i=0;i<str.length;i++)
{
System.out.println(str[i]);
}
System.out.println("----=排序后-----");
for(int i=0;i<news.length;i++)
{
System.out.println(news[i]);
}
}
这个是对于Window的排序排序前后的结果,如果是Linux结果会更加的显著,因为从Java中直接获取的Liunx的目录列表是真的乱。