有一个类似于这样的章节目录 存储在一个String[] 中
c1s.si
c2.1.1s.si
c2.1.2s.si
c2.1s.si
c2.2.1s.si
c2.2.2s.si
c2.2.3s.si
c2.2s.si
c2.3s.si
c2s.si
c3.1.1s.si
c3.1.2s.si
c3.1s.si
c3.2.1s.si
c3.2.2s.si
c3.2.3s.si
c3.2.4s.si
c3.2.5s.si
c3.2s.si
c3.3.1s.si
c3.3.2s.si
c3.3.3s.si
c3.3.4s.si
c3.3s.si
c3.4.1s.si
c3.4.2s.si
c3.4s.si
c3.5.1s.si
c3.5.2s.si
c3.5.3s.si
c3.5.4s.si
c3.5s.si
c3.6.1s.si
c3.6.2s.si
c3.6.3s.si
c3.6.4s.si
c3.6.5s.si
c3.6s.si
c3.7.1s.si
c3.7.2s.si
c3.7.3s.si
c3.7.4s.si
c3.7.5s.si
c3.7s.si
c3.8s.si
c3s.si
c4.1s.si
c4.2s.si
c4.3.1s.si
c4.3.2s.si
c4.3s.si
c4.4s.si
c4s.si请高手帮忙java 排序
期望排序结果是这个样子: 类似于 书的章节目录
c1s.si
c2s.si
c2.1s.si
c2.1.1s.si
c2.1.2s.si
c2.2s.si
c2.2.1s.si
c2.2.2s.si
c2.2.3s.si
c2.3s.si 
 

解决方案 »

  1.   

    public class BracketsApp {
    public static void main(String[] args) { String ss[] = new String[] { "c1s.si", "c2.1.1s.si", "c2.1.2s.si",
    "c2.1s.si", "c2.2.1s.si", "c2.2.2s.si", "c2.2.3s.si",
    "c2.2s.si", "c2.3s.si", "c2s.si", "c3.1.1s.si", "c3.1.2s.si",
    "c3.1s.si", "c3.2.1s.si", "c3.2.2s.si", "c3.2.3s.si",
    "c3.2.4s.si", "c3.2.5s.si", "c3.2s.si", "c3.3.1s.si",
    "c3.3.2s.si", "c3.3.3s.si", "c3.3.4s.si", "c3.3s.si" };
    Arrays.sort(ss, new Comparator<String>() {
    public int compare(String o1, String o2) {
    double d = getN(o1) - getN(o2);
    if (d < 0) {
    return -1;
    } else if (d > 0) {
    return 1;
    } else {
    return 0;
    }
    } } ); // the result:
    for (int i = 0; i < ss.length; i++) {
    System.out.println(ss[i]);
    } } public static double getN(String s) {
    Matcher m = Pattern.compile("\\d+(.\\d+)*").matcher(s);
    StringBuffer sb = new StringBuffer("");
    String result = "";
    while (m.find()) {
    sb.append(m.group());
    }
    if (sb.indexOf(".") != -1) {
    int pos = sb.indexOf(".");
    result += sb.substring(0, pos + 1)
    + sb.substring(pos + 1).replace(".", "");
    } else {
    result = sb.toString();
    }
    return Double.parseDouble(result); }}
      

  2.   

    使用比较器比较package com.liwei.question;import java.util.Arrays;
    import java.util.Comparator;public class Compare implements Comparator {
    static String[] s = { "c1s.si", "c2.1.1s.si", "c2.1.2s.si", "c2.1s.si",
    "c2.2.1s.si", "c2.2.2s.si", "c2.2.3s.si", "c2.2s.si", "c2.3s.si",
    "c2s.si", "c3.1.1s.si", "c3.1.2s.si", "c3.1s.si", "c3.2.1s.si",
    "c3.2.2s.si", "c3.2.3s.si", "c3.2.4s.si", "c3.2.5s.si", "c3.2s.si",
    "c3.3.1s.si", "c3.3.2s.si", "c3.3.3s.si", "c3.3.4s.si", "c3.3s.si",
    "c3.4.1s.si", "c3.4.2s.si", "c3.4s.si", "c3.5.1s.si", "c3.5.2s.si",
    "c3.5.3s.si", "c3.5.4s.si", "c3.5s.si", "c3.6.1s.si", "c3.6.2s.si",
    "c3.6.3s.si", "c3.6.4s.si", "c3.6.5s.si", "c3.6s.si", "c3.7.1s.si",
    "c3.7.2s.si", "c3.7.3s.si", "c3.7.4s.si", "c3.7.5s.si", "c3.7s.si",
    "c3.8s.si", "c3s.si", "c4.1s.si", "c4.2s.si", "c4.3.1s.si",
    "c4.3.2s.si", "c4.3s.si", "c4.4s.si", "c4s.si" }; @Override
    public int compare(Object o1, Object o2) {
    String s1=o1.toString();
    String s2=o2.toString();
    String[] s1Arr=s1.split("\\.");
    String[] s2Arr=s2.split("\\.");
    for(int i=0;i<s1Arr.length&&i<s2Arr.length;i++){
    if(s1Arr[i].equals(s2Arr[i])){
    continue;
    }if(s1Arr[i].compareTo(s2Arr[i])>0){
    return 1;
    }else{
    if (s1Arr[i].endsWith("s") && !s2Arr[i].endsWith("s")) {
    if (s1Arr[i].substring(0, s1Arr[i].length() - 1).equals(
    s2Arr[i])) {
    return -1;
    }
    }
    if(!s1Arr[i].endsWith("s")&&s2Arr[i].endsWith("s")){
    if(s1Arr[i].equals(s2Arr[i].substring(0, s2Arr[i].length()-1))){
    return 1;
    }
    }
    return -1;
    }
    }
    return -1;
    } public void sort(String[] s){
    Arrays.sort(s,new Compare());
    }
    public static void main(String args[]){
    new Compare().sort(s);
    for(String ss:s){
    System.out.println(ss);
    }
    }
    }