现在有一个需求如下:
比如一个数组为 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
数字排在前面,有字母的排在后面,如果一个字符串为字母和字符串组合,则相同的字母要按数字的大小排序。
大家出出主意,谢谢!

解决方案 »

  1.   

    我用内部类结合list容器写了一个,自己感觉较笨重,没有经过大量数据测试,仅供参考.
    要求,所有的字符串,字母必须出现在第一个,或最后一个.数字要完整,不能有.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));
    }
    }
      

  2.   

    2楼的代码这么长,肯定是花功夫了的,但是有一点,if else这么长,万一需求变化,改起来很麻烦的。
      

  3.   

    重写Arrays.sort的排序方法,定义自己的排序规则