现在有一个需求如下:
比如一个数组为 String a[]={"3","3.5","3T","K3","6.5","K4","2T","2.5T","4"};
要求的排序为 3,3.5,4,6.5,K3,K4,2T,2.5T,3T
数字排在前面,有字母的排在后面,如果一个字符串为字母和字符串组合,则相同的字母要按数字的大小排序。
大家出出主意,谢谢!
比如一个数组为 String a[]={"3","3.5","3T","K3","6.5","K4","2T","2.5T","4"};
要求的排序为 3,3.5,4,6.5,K3,K4,2T,2.5T,3T
数字排在前面,有字母的排在后面,如果一个字符串为字母和字符串组合,则相同的字母要按数字的大小排序。
大家出出主意,谢谢!
要求,所有的字符串,字母必须出现在第一个,或最后一个.数字要完整,不能有.2这样的形式,而是0.2.import java.util.*;
public class HybridStringSort
{
public static String[] hybridSort(String[] stringArray)
{
//内部类,用于放String
class Content implements Comparable
{
private String str=null;
public String getString()
{
return str;
}
public void setString(String str)
{
this.str=str;
}
public Content(String str)
{
this.str=str;
}
public int compareTo(Object o)
{
String str=this.getString();
char startThis=str.charAt(0); //第一个字符。
char endThis=str.charAt(str.length()-1); //最后一个。 Content other=(Content)o;
String otherString=other.getString();
char startOther=otherString.charAt(0);
char endOther=otherString.charAt(otherString.length()-1);
//如果都是一个字符,且为数字。
//
if(str.length()==1&&otherString.length()==1)
{
if((startThis>='0'&&startThis<='9')&&
(startOther>='0'&&startOther<='9'))
{
return (int)startThis-(int)startOther;
}
else if(startThis>='0'&&startThis<='9') //这是数字,另一是字母。
{
return -1;
}
else if(startOther>='0'&&startOther<='9')//这字母,另一是数字。
{
return 1;
}
else //都是字母。
{
return (int)startThis-(int)startOther;
}
}
//第一个字符串为一个字符。
else if(str.length()==1)
{
if(startThis>='0'&&startThis<='9') //第一个是数字。
{
if((startOther<'0'||startOther>'9'||//第二个不是数字。
endOther<'0'||endOther>'9'))
{
return -1;
}
else
{
double other1=Double.parseDouble(otherString);
double thisChar=Double.parseDouble(str);
return thisChar>other1?1:-1;
}
}
else // 这是字母。
{
if(startOther<'0'||startOther>'9')//另一个的第一个是字母
{
return (int)startThis-(int)startOther;//看首字母谁大。
}
else //首字符数字
{
return 1;
}
}
} //第二个字符串字符为一个。
else if(otherString.length()==1)
{
if(startOther>='0'&&startOther<='9') //另一个首字符是数字。
{
if((startThis<'0'||startThis>'9'||
endThis<'0'||endThis>'9'))//这个不是数字。
{
return 1;
}
else
{
double thisChar=Double.parseDouble(str);
double other1=Double.parseDouble(otherString);
return thisChar>other1?1:-1;
}
}
else // 另一个首字符是字母。
{
if(startThis<'0'||startThis>'9')//这个的第一个是字母
{
return (int)startThis-(int)startOther;//看首字母谁大。
}
else //首字符数字
{
return -1;
}
}
} //两个字符串长度都大于2。
//1 都无字母。
//2 第一个有字母,第二个无字母。
//3 第一个无字母,第二个有字母。
//4 第一个有首字母,第二个有首字母。
//5 第一个有首字母,第二个有尾字母。
//6 第一个有尾字母,第二个有首字母。
//7 都是有尾字母。
else
{
//1都无字母。
if((startThis>='0'&&startThis<='9')&&
(endThis>='0'&&endThis<='9')&&
(startOther>='0'&&startOther<='9')&&
(endOther>='0'&&endOther<='9')) {
double thisChar=Double.parseDouble(str);
double other2=Double.parseDouble(otherString);
return thisChar>other2?1:-1;
//return (int)(thisChar-other2);
}
//2第一个有字母,第二个无字母。第一个大!
else if(((startThis<'0'||startThis>'9')||
(endThis<'0'||endThis>'9'))&&
((startOther>='0'&&startOther<='9')&&
(endOther>='0'&&endOther<='9'))) {
return 1;
} //3 第一个无字母,第二个有字母。
else if(((startThis>='0'&&startThis<='9')&&
(endThis>='0'&&endThis<='9'))&&
((startOther<'0'||startOther>'9')||
(endOther<'0'||endOther>'9')))
{
return -1;
} //4 第一个有首字母,第二个有首字母
else if((startThis<'0'||startThis>'9')&&
(startOther<'0'||startOther>'9'))
{
if(startThis==startOther) //首字母相等。
{
String s1=str.substring(1);
String s2=otherString.substring(1);
double d11=Double.parseDouble(s1);
double d22=Double.parseDouble(s2);
return d11>d22?1:-1;
}
else
{
return (int)startThis-(int)startOther;
}
}
//5 第一个有首字母,第二个有尾字母。
else if((startThis<'0'||startThis>'9')&&
(endOther<'0'||endOther>'9'))
{
if(startThis==endOther)
{
return 1;
}
else
{
return (int)startThis-(int)endOther;
}
}
//6 第一个有尾字母,第二个有首字母。 else if((endThis<'0'||endThis>'9')&&
(startOther<'0'||startOther>'9'))
{
if(startOther==endThis)
{
return -1;
}
else
{
return (int)endThis-(int)startOther;
}
}
//7 都是有尾字母。
else
{
if(endThis==endOther)
{
String s1=str.substring(0,str.length()-1);
String s2=otherString.substring(0,
otherString.length()-1);
double d11=Double.parseDouble(s1);
double d22=Double.parseDouble(s2);
return d11>d22?1:-1;
}
else
{
return (int)endThis-(int)endOther;
}
}
}
}
}//end class Content List<Content> list=new ArrayList<Content>();
for(int i=0;i<stringArray.length;i++)
{
Content con=new Content(stringArray[i]);
list.add(con);
}
Collections.sort(list);
String[] b=new String[list.size()];
for(int i=0;i<list.size();i++)
{
b[i]=list.get(i).getString();
}
return b;
} public static void main(String[] args)
{
//String a[]={"3","3.5","3T","K3","6.5","K4","2T","2.5T","4"};
String a[]={"3","3.5","3T","K3","6.5","K4","2T",
"2.5T","4","1.0","0.1","K3.1","10","a1","b3","1a","1.0a","0.3a"};
String[] result=hybridSort(a);
System.out.println(Arrays.toString(result));
}
}