运用基本数据类型重写一个实现与java.lang.String.replaceAll()一样功能的方法
使用基本数据类型重写一个实现与java.lang.String.replaceAll()一样功能的方法
我这个方法是不能按照正则表达式来解释的,如果这样的话自己写正则表达式解释器是件高难度的工作啊
最近面试碰到个让重写String.replaceAll()方法的题目,但是却没说是否限制使用其他类的方法,我这里暂且只使用基本数据类型来完成此功能.
编写过程比较头疼,烧死我好多脑细胞,不知道是我想的太复杂还是没经过深思熟虑就开始编写,反正思想是, 如"This is a Test"需要将'is'替换成'e'(数组R),则先截取第一个'is'的前半部分为一个数组A,取第一个'is'的后半部分为一个数组B,再将A,R,B合并到同一个数组.
代码如下:
/** * 图示: ★★★☆☆★★★☆ * * @param original 原字符串(要替换的总字符串)[★★★☆☆★★★☆] * @param old 被替换的字符串 [☆] * @param replace 替换的字符串 [⊙] * @return 被替换后的总字符串 [★★★⊙⊙★★★⊙] */ public static char[] replaceAll(char[] original,char[] old,char[] replace) { if(original == null || old == null || replace == null){ return original; } else{ if(original.length == 0 || old.length == 0 || replace.length == 0){ return original; } } char[] c = original; char[] o = old; char[] r = replace; boolean e = false;//用于判断是否已找到被替换字符串 char[] newChars = null; for (int i = 0; i < c.length; i++) { //能替换原字符串,说明将剩下的字符串长度 >= 被替换字符串长度 if(c.length - i >= o.length){ if(c[i] != o[0]){ continue; } else{ //全力以赴寻找需被替换字符.. for (int j = 0; j < o.length; j++) { if(c[i + j] == o[j]){ e = true; } else{ e = false; break; } } //终于找到被替换的字符啦~~ if(e){ //计数器,由于目标无法确定当前循环中新建的字符数组的实质长度,固用此变量统计 int count = 0; //自定义数组长度策略,你还有更好的吗... int length = o.length < r.length ? (c.length + r.length) : (c.length - (o.length - r.length)); newChars = new char[length]; //下面的图示只描述第一次循环的情况 /**加入原字符串的前半部分(★★★)后,当前[★★★]*/ for (int j = 0; j < i; j++) { //加大字符数组总容量 if(j > newChars.length){ //加大的容量是一种策略,可能还有其他更好的策略,下同 newChars = capacity(newChars, newChars.length + i); } newChars[j] = c[j]; count ++; } /**加入替换的字符串(⊙)后,当前[★★★⊙]*/ for (int j = i,k = 0; k < r.length; j++,k++) { //加大字符数组总容量 if(j > newChars.length){ newChars = capacity(newChars, newChars.length + r.length); } newChars[j] = r[k]; count ++; } /**加入原字符串的后半部分(☆★★★☆)后,当前[★★★⊙☆★★★☆]*/ for (int j = i + r.length,k = i + o.length; k < c.length; j ++,k ++) { //加大字符数组总容量 if(j > newChars.length){ newChars = capacity(newChars, newChars.length + c.length - i - 1); } newChars[j] = c[k]; count ++; } //减少字符数组无用的长度 newChars = capacity(newChars, count); /**到目前为止,新建的字符数组newStr字符为 [★★★⊙☆★★★☆],还有未替换,继续循环执行之*/ //将新建的字符数组作为当前循环替换的 '原字符串' c = newChars; //避免对已替换字符(或字符数组)执行重复的查找、替换操作 i = i + r.length > 1 ? r.length : 0; //重置操作 e = false; newChars = null; } } } } return c; } /** * 对字符数组进行容量变更,按照 length 参数的大小,生成新的字符数组, * 原来数组长度若比 length 参数的大,从原数组截取length大小的字符于新数组中, * 其他情况则直接将原数组复制到新数组 * @param c 变更的字符数组 * @param length 变更的长度 * @return */ private static char[] capacity(char[] c,int length){ char[] newChars = new char[length]; int count; //取较小的,用于截取字符 if(length < c.length){ count = length; } else{ count = c.length; } //复制字符数组 for (int i = 0; i < count; i++) { newChars[i] = c[i]; } return newChars; }
测试的main方法如下:
public static void main(String[] args) { char[] original = {'a','b','c','+','+','a','k','#','+'}; char[] old = {'+'}; char[] replace = {'⊙','_','⊙'}; System.out.println(replaceAll(original, old, replace)); }
运行结果:
abc⊙_⊙⊙_⊙ak#⊙_⊙
由于用于循环调用的数组的容量会动态变化,因此其下标的相关计算会很头疼,可能还有更好的办法替换我这种做法,但是我觉得总体思想应该不会变.
1 楼
jackra
2011-08-20
public String replaceAll(String regex,String replacement)
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher
2 楼
forchase
2011-08-20
jackra 写道
public String replaceAll(String regex,String replacement)
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher
我这个方法是不能按照正则表达式来解释的,如果这样的话自己写正则表达式解释器是件高难度的工作啊