我想做个排序,假设有一组数里面包含('1','2','012','3','04',还有'16_1','18_2')等字符串
要求得到排序结果'1','2','3','04','012','16_1','18_2'.
主要是数据遗留问题.感觉很难做.希望高手帮忙.谢谢!

解决方案 »

  1.   

    首先分成2组: 1组是能直接转int的,另一组带"_"的。各自求值问题应该不大麻烦的应该是有没有 15_3 , 15_6这种问题
      

  2.   

    字符串数组的话,用replace()或者 replaceAll(),把非数字替换成"",
    再转化成int型循环比较大小
      

  3.   

    对,是有15_3,15_6而且还有15_3,15+4,这种问题.因为用户在输入的时候没有进行控制所以导致现在数据格式不统一.比较麻烦.假设我已经取到一组字符串型的数字放入了List当中.如何过滤?谢谢!
      

  4.   

    这个很简单,用一个类包装继承Comparable就可以了。有什么难的地方?最麻烦的也就是 麻烦的应该是有没有   15_3   ,   15_6这种问题妈的,只有一位的话,改成小数点。 
      

  5.   

    用javascript写的一个实现~function mysort(){
      var src = new Array('1','2','012','3','04','16_1','18_2');
      alert("排序前数组[" + src.toString()+"];");
      
      var dest = src.sort(
        function st(a,b){
          return parseInt(a)-parseInt(b);
        }
      );
      alert("排序后数组[" + dest.toString()+"];");
    }
    结果:
    排序前数组[1,2,012,3,04,16_1,18_2]
    排序后数组[1,2,3,04,012,16_1,18_2]
      

  6.   

    说明一下,结果中不带引号是因为src.toString()的缘故;
    其实src和dest都是字符串数组
      

  7.   

    对于15_3,15_6而且还有15_3,15+4之类的,只要你定义一个统一的比较规则就可以了~
    比如你规定15_6<15_6<15+3,也就是先比较整数(+/-前面的),
    如果前面相等,那就比较后面的,_看做-,+看做+,那上面代码进一步改为:function mysort(){
      var src = new Array('1','15_6','2','012','15_3','3','04','16_1','15+6','18_2');
      alert("排序前数组[" + src.toString()+"];");
      
      var dest = src.sort(
        function st(a,b){
          if (a == b){
            return 0;
          }
          var _a = parseInt(a);
          var _b = parseInt(b);
          if (_a == _b){
            var _tA = a.replace('_','-');
            var _tB = b.replace('_','-');
            var _tmpA = _tA.substr(_a.toString().length);
            if (_tmpA == null || _tmpA == ''){
              _tmpA = '0';
            }
            var _tmpB = _tB.substr(_b.toString().length);
            if (_tmpB == null || _tmpB == ''){
              _tmpB = '0';
            }
            return parseInt(_tmpA)-parseInt(_tmpB);
          }else{
            return _a-_b;
          }
        }
      );
      alert("排序后数组[" + dest.toString()+"];");
    }
    结果:
    排序前数组[1,15_6,2,012,15_3,3,04,16_1,15+6,18_2];
    排序后数组[1,2,3,04,012,15_6,15_3,15+6,16_1,18_2];
      

  8.   

    Java中最简单的实现方法:Comparatorimport java.util.Comparator;public class MyComparator implements Comparator {  public int compare(Object o1, Object o2) {
        return toInt(o1) - toInt(o2);
      }  public boolean equals(Object obj) {
        return true;// 不必实现
      }  public static int toInt(Object o) {
        String str = (String) o;
        // 消除特殊字符
        str = str.replaceAll("_", "");// _
        str = str.replaceAll("[+]", "");// +
        // 最后再消除前面的0
        while ("0".equals(str.substring(0, 1))) {
          str = str.substring(1);
        }
        return Integer.parseInt(str);
      }}测试类:import java.util.Arrays;public class MyComparatorTest {
      public static void main(String[] args) {
        String[] source = new String[] { "2", "30", "012", "_0400", "+016_1", "2+5" };
        String[] result = new String[source.length];
        System.arraycopy(source, 0, result, 0, source.length);
        //排序
        Arrays.sort(result, new MyComparator());
        //结果
        for (int i = 0; i < source.length; i++) {
          System.out.println(MyComparator.toInt(result[i]) + "   " + result[i]
              + "   " + source[i]);
        }
      }
    }排序结果:
    对应的数字 结果数组     源数组
    2         2          2
    12        012        30
    25        2+5        012
    30        30         _0400
    161       +016_1     +016_1
    400       _0400      2+5
      

  9.   

    关键不是排序的问题
    实现一个方法 比如
    double getNumber(String str){...根据自己的需要写}
    把字符串转换成根据自己标准转义的double(这个方法可以在Comparator接口中调用)
    有标准后面就好办了
      

  10.   

    8楼的代码修改了一下.MyComparator 这个类.
    import java.util.Comparator;public class MyComparator implements Comparator {  public int compare(Object o1, Object o2) {
      
      o1 = o1.toString().replaceAll("^([_+0]+)", "");
      o2 = o2.toString().replaceAll("^([_+0]+)", "");   String[] s1 = o1.toString().split("[_+]");
      String[] s2 = o2.toString().split("[_+]");
      if(!s1[0].equals(s2[0])) 
      return Integer.parseInt(s1[0])-Integer.parseInt(s2[0]);
      else if(s1.length != s2.length)
      return s1.length-s2.length;
      else
      return Integer.parseInt(s1[s1.length-1])-Integer.parseInt(s2[s2.length-1]);
      
      }}