请用最快(最有效率)的方法对以下规则的字符串进行排序
有一些形如以下格式的字符串:
v2.0.9.201008271530
v2.0.8.201006021935
v1.0.7.201006011800
v1.0.6.200912241630
v10.0.5.200910121350
v1.0.4.200909291500
v1.10.3.200908261100
v1.0.2.200908121300
v1.0.10.201009131000
v1.0.1.200907201000
经排序后使得这些版本信息的字符串由高到低排列下来,如:
v10.0.5.200910121350
v2.0.10.201006021935
v2.0.9.201008271530
v1.10.3.200908261100
v1.1.4.200909291500
v1.0.10.201009131000
v1.0.7.201006011800
v1.0.6.200912241630
v1.0.2.200908121300
v1.0.1.200907201000

解决方案 »

  1.   

    嘿嘿看了几个帖子大家现在都玩算法了,现成的为什么不用了.Arrays.sort就可以了啊.都在玩数字游戏^_^
      

  2.   


    public class VersionSorter {
    private String[] verList;

    public VersionSorter(String[] verList) {
    this.verList = verList;
    }

    public VersionSorter() {
    verList = new String[] { 
    "v1.0.6.200912241630",
    "v1.0.4.200909291500",
    "v2.0.8.201006021935",
    "v1.0.10.201009131000",
    "v1.0.8.201006021935",
    "v2.0.10.201006021935",
    "v2.0.2.201006021935"
    };
    } public void sort() {
    int len1 = verList.length;
    String[][] sVer = new String[len1][];
    for (int i = 0; i < len1; i++) { // 得到分组
    sVer[i] = verList[i].substring(1).split("\\.");
    }
    long[] lVer = new long[len1]; //每个串映射一个long型数据
    int len2 = sVer[0].length - 1;
    for (int i = 0; i < len1; i++) { // 赋值
    lVer[i] = 0L;
    for (int j = 0; j < len2; j++) {
    lVer[i] = lVer[i] << 8 | Integer.parseInt(sVer[i][j]); // 转为32位数
    }
    } for (int i = 0; i < len1; i++) {
    for (int j = 0; j < len1; j++) {
    if (lVer[i] > lVer[j]) {//由于long型数据和串是映射关系
    long lTemp = lVer[i]; //所以
    lVer[i] = lVer[j];    //必须
    lVer[j] = lTemp;    //加入这三行

    String sTemp = verList[i];
    verList[i] = verList[j];
    verList[j] = sTemp;
    }
    }
    }
    } public void print(String tip) {
    System.out.println(tip);
    for (String str : verList) {
    System.out.println(str);
    }
    System.out.println();
    } public static void main(String[] args) {
    VersionSorter vs = new VersionSorter();
    vs.print("排序前");
    vs.sort();
    vs.print("排序后");
    }
    }
      

  3.   

    你忽略了排序的规则:
    “v10.0.5.200910121350
    v2.0.10.201006021935
    v2.0.9.201008271530
    v1.10.3.200908261100”
    是按字符串中的数字按大小降序排序,而不是按字符顺序排序。
      

  4.   


    支持!
    所以用集合类中的sort方法也是没有用。
      

  5.   


    这个算法是错的,当数据如下时:
    v1.0.10.201009131000
    v1.0.1.201009131000
    v1.0.1.200907201003
    排序的结果仍是:
    v1.0.10.201009131000
    v1.0.1.201009131000
    v1.0.1.200907201003这时正确的结果应该是:
    v1.0.10.201009131000
    v1.0.1.201009131003
    v1.0.1.200907201000
      

  6.   

    不好意思,上楼的数据应该用:
    v1.0.10.201009131000
    v1.0.1.200907201000
    v1.0.1.200907201003
    复制时用错了。
    但是算法是错的。
      

  7.   

    可以写一个类如Version,实例变量分别执有字符串中相应的数据,字母和数字都是有规律的,然后实现一个Comparable接口或者Comparator,比较这个类的实例时,如果前面的数据相等,则进行比较下一个数据。其实就像员工排序,先按年龄排序,如果年龄相等,再按名字的字母顺序排序一样,只是这个类的比较多了几个域。最后使用util里提供的排序算法进行排序。
      

  8.   

    public class Version implements Comparable<Version> {
        public Version(String version){
        this.version = version;
        String[] fields = version.substring(1).split("\\.");
        this.major = Integer.valueOf(fields[0]);
        this.minor = Integer.valueOf(fields[1]);
        this.build = Integer.valueOf(fields[2]);
        this.datetime = Long.valueOf(fields[3]);
        }    @Override public boolean equals(Object that){
        if(that == null) return false;
        if(this.getClass() != that.getClass()) return false;
        return this.version.equals(((Version)that).version);
        }    @Override public int compareTo(Version that){
        if (this.version.equals(that.version)) return 0;
        if (this.major > that.major) return 1;
        if (this.major < that.major) return -1;
        if (this.minor > that.minor) return 1;
        if (this.minor < that.minor) return -1;
        if (this.build > that.build) return 1;
        if (this.build < that.build) return -1;
        if (this.datetime > that.datetime) return 1;
        if (this.datetime < that.datetime) return -1;
        return 0;
        }    @Override public int hashCode(){
        return version.hashCode();
        }    @Override public String toString(){
        return version;
        }    private String version;
        private int major;
        private int minor;
        private int build;
        private long datetime;
    }
    public class VersionSortExample{
        public static void main(String[] args) {
        String[] versions = {"v2.0.9.201008271530",
                     "v2.0.8.201006021935",
                     "v1.0.7.201006011800",
                     "v1.0.6.200912241630",
                     "v10.0.5.200910121350",
                     "v1.0.4.200909291500",
                     "v1.10.3.200908261100",
                     "v1.0.2.200908121300",
                     "v1.0.10.201009131000",
                     "v1.0.1.200907201000",};
        
        Version[] cversions = new Version[versions.length];
        for(int i = 0 ; i< versions.length; i++){
            cversions[i] = new Version(versions[i]);
        }
        java.util.Arrays.sort(cversions,new java.util.Comparator<Version>(){
            @Override public int compare(Version v1,Version v2){
                return -(v1.compareTo(v2));
            }
            });
        for(Version v : cversions){
            System.out.println(v);
        }
        }
    }v10.0.5.200910121350
    v2.0.9.201008271530
    v2.0.8.201006021935
    v1.10.3.200908261100
    v1.0.10.201009131000
    v1.0.7.201006011800
    v1.0.6.200912241630
    v1.0.4.200909291500
    v1.0.2.200908121300
    v1.0.1.200907201000
      

  9.   

    字符串的最后一节显然是“日期时间”,如果它所对应的版本号是严格按时间顺序的,那么只要把这最后一节取出来进行排序就 OK 了。如果“日期时间”不是严格按照时间顺序的,那么可以考虑把前面的三节数字都补足成两位的,然后直接用字符串排序就可以了。■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  10.   

    有道理。 那么可以扩展一下,把所有子部分全部补全前导0,就可以字符串比较了:// 原始数据
    String[] datas={
        "v10.0.5.200910121350","v1.0.2.200908121300"....
    }// 补全
    String[] completeData=new String[datas.length];
    for(int i=0;i<datas.length;i++){
        completeData[i] = CompleteString(datas[i]);
    }// 排序
    TreeMap<String, Integer> sortedResult = new TreeMap<...>();
    for(int i=0;i<datas.length;i++){
        sortedResult.put(completeData[i], i);
    }// 打印结果
    for(String key: sortedResult.keySet()){
        system.out.println(datas[sortedResult.get(key)]);
    }// 补全函数
    String CompleteString(String inStr){
        String[] fields = inStr.substr(1,inStr.len()-1).split("\\."); // 去掉v字符,然后按.分隔
        StringBuffer result=new StringBuffer();
        for(int i=0;i<fields.length-1;i++){
            result.append(String.format("%03d",Integer.parseInt(fields[i])));
        }
        result.append(fields[fields.length-1]);
        return result.toString();
    }