字符串abc123de45f67,把里面所有的数字字串找出来,并且存贮起来,例如你要把123,4,67找出来,放到3个char型数组里。怎么做?

解决方案 »

  1.   

    这是一个尤其适合的正则表达式场景。
            Pattern p = Pattern.compile("[\\d]+");
            Matcher m = p.matcher(abc123de45f67);
            //m.matches();
      

  2.   

    使用asc码判断数字,从字符串头开始查找,把找到的数据,放到临时变量中。
      

  3.   


    public static void main(String[] args)throws Exception {
    String str = "abc123de45f67";
    List<char[]> list = new ArrayList<char[]>();
    StringBuffer sb = new StringBuffer();
    boolean find = false;
    for(int i=0,j=str.length();i<j;i++){
    char ch = str.charAt(i);
    if(ch >= '0' && ch <= '9'){
    find = true;
    }else{
    find = false;
    if(sb.length() > 0){
    list.add(sb.toString().toCharArray());
    sb.delete(0, sb.length());
    }
    }
    if(find){
    sb.append(ch);
    }
    }
    if(sb.length() > 0){
    list.add(sb.toString().toCharArray());
    sb.delete(0, sb.length());
    }
    for(int i=0;i<list.size();i++){
    System.out.println(java.util.Arrays.toString(list.get(i)));
    }
    }
      

  4.   


    public static void main(String[] args) {
    String str = "abc123de45f67";
    char[] c = getChar(str);
    System.out.println(Arrays.toString(c));
    } public static char[] getChar(String info) {
    String[] str = info.split("\\D+");
    char[] c = {};
    for (String s : str) {
    if (!"".equals(s)) {
    c = Arrays.copyOf(c, c.length + 1);
    c[c.length - 1] = (char) Integer.parseInt(s);
    }
    }
    return c;
    }
      

  5.   


    跑了一下,就三楼哥们的code出结果了。。
      

  6.   

      var su=/[\\+\\*/-]/;
       szi=ww.split(su);
    这是取数字,字符没弄出来。建议去看看正则表达式。
      

  7.   

    查看了一下API这么写应该是可以满足要求的Pattern p = Pattern.compile("\\D+");
    String[] numbers = p.split("abc123de45f67");
    for(String number:numbers){
       if(null!=number && !"".equals(number)) System.out.println(number);
    }
      

  8.   

    public static void main(String[] args)throws Exception {
      //查询本字符串中的数字,并把数据放到char数组中.
             String str = "abc123de45f67";
             //保存最终结果
             List<char[]> list = new ArrayList<char[]>();
             //用于收集数字
             StringBuffer sb = new StringBuffer();
             //true表示当前是数字,false表示当前是字母.
             boolean find = false;
             for(int i=0,j=str.length();i<j;i++){
              //取当前一个字符.
                 char ch = str.charAt(i);
                 
                 //if(ch >= '0' && ch <= '9'){
                 if( '0' <= ch && ch <= '9'){
                  //当前是数字
                     find = true;
                 }else{
                  //当前是字母
                     find = false;
                     //保存之前的数字到list
                     if(sb.length() > 0){
                         list.add(sb.toString().toCharArray());
                         sb.delete(0, sb.length());
                     }
                 }
                 //当前是数字,则收集数字.
                 if(find){
                     sb.append(ch);
                 }
             }
             //收集数字.
             if(sb.length() > 0){
                 list.add(sb.toString().toCharArray());
                 sb.delete(0, sb.length());
             }
             //打印结果.list的元素类型是char[]数组.
             for(int i=0;i<list.size();i++){
                 System.out.println(java.util.Arrays.toString(list.get(i)));
             }
    我认为3#原创作者,知道怎么用正则表达式.只想他想温习一下代码操纵字符的功力.
    谢谢.
      

  9.   

    对了,忘了说还有一点.在单线程下StringBuilder比StringBuffer效率高.所以上面的代码应该使用StringBuilder.
      

  10.   


    多线程下StringBuilder也比StringBuffer效率高,自己好好琢磨琢磨.......
      

  11.   


    你好我想了一下.
    找JDK源码:
    ###########################################################
        StringBuffer部分方法源码.
         /**
          * @see     java.lang.String#valueOf(java.lang.Object)
          * @see     #append(java.lang.String)
          */
         public synchronized StringBuffer append(Object obj) {
      super.append(String.valueOf(obj));
             return this;
         }
     
         public synchronized StringBuffer append(String str) {
      super.append(str);
             return this;
         }
         StringBuilder部分方法源码
          /**
          * @see     java.lang.String#valueOf(java.lang.Object)
          * @see     #append(java.lang.String)
          */
         public StringBuilder append(Object obj) {
      return append(String.valueOf(obj));
         }
     
         public StringBuilder append(String str) {
      super.append(str);
             return this;
         }
    ###################################################
    可见StringBuffer的方法使用了同步,所以它慢.而StringBuilder的方法没有使用同步所以不能用会多线程环境下.
    所以我说:------在单线程下StringBuilder比StringBuffer效率高.--------有一个前提是在单线程环境下去比较它们俩个,因为在单线程下它们都是安全的,才有可比性.而在多线程情况下StringBuilder不保证同步所以没有可以比较的前提。
    JDK文件中也说:----
       public final class StringBuilderextends Objectimplements Serializable, CharSequence一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。并且我还写了一个代码:
    在我的机器上的运行情况见图片:
    public static void main(String[] args) {
      //操作次数
      int count = 9999999;
      StringBuffer sBuffer = new StringBuffer();
     
      //开始任务A,记时开始.
      Long startTime = System.currentTimeMillis();
      for(int i=0; i<count; i++){
      sBuffer.append("A");
      }
      //任务A,记时结束.
      Long endTime =  System.currentTimeMillis();
      //记录任务A所用时间
      Long jobATime = endTime - startTime;
     
      //开始任务B,记时开始.
      StringBuilder sBuilder = new StringBuilder();
      startTime = System.currentTimeMillis();
      for(int i=0; i<count; i++){
      sBuilder.append("B");
      }
      //任务B,记时结束.
      endTime =  System.currentTimeMillis();
      //记录任务B所用的时间.
      Long jobBTime = endTime - startTime;
      System.out.println("任务A(StringBuffer)-------任务B(StringBuilder)");
      System.out.println(jobATime+"------------------------------"+jobBTime);
     
      } 
      

  12.   

    3楼的也对,不过不够好,,楼上的是对的,用String的split方法,里面是正则表达式,就可以实现了,只要一句话
      

  13.   

    简单的就是正则表达式  麻烦一点的是 AScll
      

  14.   

    可以使用正则表达式
    pattern = ...
    matcher = ...
    while(matcher.find()){
      sysout(matcher.group());
    }
     可以试一下
      

  15.   

    Pattern p = Pattern.compile("\\d+");
    String s = "abc123de45f67";
    Matcher m = p.matcher(s); 

    while(m.find()){
    p(m.group());
    }