注:默認將漢字的優先級爲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的目錄列表是真的亂。