在网上看到一个笔试题:
假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)有人给出这样的解法:import java.util.Arrays;public class Test {   
    public static void main(String args[]) {    
        String str="6sabcsssfsfs33";   
        boolean[] removeChars = new boolean[256];   
        Arrays.fill(removeChars, false);   
        removeChars['a'] = true;   
        removeChars['b'] = true;   
        removeChars['3'] = true;   
        StringBuffer sb = new StringBuffer();   
        for (int i = 0; i < str.length(); i++) {   
            char ch = str.charAt(i);   
            if (!removeChars[ch]) 
             sb.append(ch);   
        }   
        String result = sb.toString();   
        System.out.println(result);   
    }    
}  
但我有2点看不明白
1. 为什么boolean数组的大小声明为256?
2. removeChars['a'] = true; 这是种什么用法啊,数组不是用下标的吗,比如removeChars[0] = true,怎么直接把字符放俩面了,看不明白,是解析成了ascii吗?removeChars['a']相当于removeChars[97]?

解决方案 »

  1.   

    java的数组声明和c语言不一样,不能在声明处指明大小
    boolean[] removeChars = new boolean[256]; bool 数组不适合用于创建位数组或位缓冲区
      

  2.   

    1. 为什么boolean数组的大小声明为256?
    其实boolean设为128,也可以,因为这里他就是要大于Ascii码的总数就行,也就是大于128就行,因为这个字符串里的字符都是Ascii码可以包含的
    2. removeChars['a'] = true; 这是种什么用法啊,数组不是用下标的吗,比如removeChars[0] = true,怎么直接把字符放俩面了,看不明白,是解析成了ascii吗?removeChars['a']相当于removeChars[97]?
    是,Ascii码和数字是相通的,可以相互表示,
    char ch = str.charAt(i);   
                if (!removeChars[ch]) 
                    sb.append(ch);   
    当ch=a时,removeChars[a]就相当于removeChars[97],也就是fasle,然后sb.append(a),就不执行
    差不多就是这样
      

  3.   

       String str="6sabcsssfsfs33";  StringBuffer bf=new StringBuffer(str);
     bf.deleteCharAt(2);
    bf.deleteCharAt(3);
    bf.deleteCharAt(12);
    bf.deleteCharAt(13);
      

  4.   

    楼上的,谁说不能指明大小了
    楼主中给出的方法是不对的,应为题目要求是删除"ab3"这个字符串,只有这三个字符在一块时才删除而不是将任意处的'a','b','3'删除,1.他定义成256是因为字符是一个字节最多也就256个,这样就可以包含所有的字符了,2.把字'a'转换成了int,这们他可以容易找到是数组中的哪一个元素,在java 字符本身就是以整型的形式存在的.