`

使用基本数据类型重写一个实现与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
7
分享到:
评论
2 楼 forchase 2011-08-20  
jackra 写道
public String replaceAll(String regex,String replacement)
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher

我这个方法是不能按照正则表达式来解释的,如果这样的话自己写正则表达式解释器是件高难度的工作啊
1 楼 jackra 2011-08-20  
public String replaceAll(String regex,String replacement)
第一个参数是个正则,你这个重写的也能满足噻?
说不准是在考java.util.regex.Matcher

相关推荐

    org.apache.commons.lang3.StringUtils.jar.rar

    Apache Commons Lang 是一个由 Apache 软件基金会开发的 Java 类库,它提供了一系列实用工具类,用于增强 JDK 内置的 String 类的功能。在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以...

    JS中实现replaceAll的方法(实例代码)

    文章接着介绍了如何自定义一个replaceAll函数,这个函数利用了String对象的原型,通过扩展String原型来添加replaceAll方法,使其成为String对象可以调用的新方法。这个自定义的replaceAll方法不仅考虑了正则表达式和...

    String.prototype.replaceAll:适用于String.prototype.replaceAll ESnext提案的符合规范的polyfill

    如果不可用或不String.prototype.replaceAll调用其“ shim”方法对String.prototype.replaceAll进行填充。 该软件包实现了接口。 它在ES3支持的环境中工作,并符合。 最常见的用法: const assert = require ( '...

    java 日志的数据脱敏的实现方法

    一种常见的做法是在Model层中重写getter方法,添加一个额外的`getPlain`方法来获取未脱敏的原始数据。然而,这种方法存在一个缺点,即无论何时数据被访问或序列化,都会使用脱敏后的数据,这可能并不总是理想的。 ...

    java中的String类常用方法解析(一)

    本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...

    String manipulation operations in java.zip

    本压缩包"String manipulation operations in java.zip"中的内容可能是一个关于Java字符串操作的项目或教程,其中特别提到了`underscore.string.java-master`这个子文件,暗示了它可能使用了`underscore.string`库来...

    js使用正则实现ReplaceAll全部替换的方法

    第三种方法尤其有用,因为它可以直接调用,语法上与Java或其他一些语言的replaceAll方法一致,提高了代码的可读性和易用性。 此外,文中还提到了两个JavaScript正则表达式工具网站,提供了在线测试和在线生成正则...

    完整版 Java初级教程 Java语言程序设计 第7章 Java中的常用类(共14页).ppt

    - 字符串与基本数据类型之间的转换可以通过`Integer.parseInt(String s)`或`String.valueOf(int i)`等方法实现。 2. **`java.lang.StringBuilder`类**: - `StringBuilder`用于构建可修改的字符串序列,比`String...

    String.replaceAll方法详析(正则妙用)

    在Java编程语言中,`String.replaceAll`方法是一个非常强大的工具,尤其当结合正则表达式使用时,可以实现复杂的文本处理。本文将深入探讨`String.replaceAll`方法的使用及其背后的正则表达式分组概念。 首先,`...

    Java-String类的常用方法总结.pdf

    Java中的String类是编程中最常用的类之一,它用于表示不可变的...这些方法构成了Java中处理字符串的基本操作,使得我们能够高效地处理和操作文本数据。理解和熟练运用这些方法对于任何Java开发者来说都是非常重要的。

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    在Java编程语言中,面向对象基础是学习Java的基石,而`String`类则是最常用的类之一,几乎在每一个程序中都会见到它的身影。本章节将深入探讨`String`类的常用方法,帮助你更好地理解和运用这个核心组件。 `String`...

    JAVA小论文(浅谈String类)

    字符串对象可以调用public String replaceAll(String oldString, String newString)方法和public String replaceFirst(String oldString, String newString)方法实现字符串的替换。 Java中没有内置字符串类型,字符...

    Java面试要点(适用于2年以上经验,1年亦可)

    Java 面试要点(适用于 2 年以上经验,1 年亦可) Java 是一种广泛使用的编程语言,涵盖了基础知识、JVM、并发、锁、...10. 不使用 synchronized 如何实现一个线程安全的单例 11. sleep 和 wait 12. wait 和 notify

    java replace

    在Java编程语言中,`replace`方法是字符串(String)类的一个重要成员,用于替换字符串中的特定字符或子串。这个方法在处理文本数据时非常常用,尤其在我们需要替换某个字符或者模式时。下面我们将详细探讨`replace`...

    Java常用类与基础API-String的构造器与常用方法

    ### Java常用类与基础API-String的构造器与常用方法 #### 一、String的常用API-1 ##### (1)构造器 1. **介绍** - `public String()`: - 初始化新创建的 `String` 对象,以使其表示空字符序列。即创建了一个...

    Java String.replace()方法&quot;无效&quot;的原因及解决方式

    在使用Java String类型的replace和replaceAll方法时,我们需要注意这种机制,不要以为replace和replaceAll方法会修改原来的字符串对象,而是需要将返回值赋值给一个新的字符串对象。 补充知识:Java String字符串...

    java 经典编程事例

    本实例演示了如何使用Java反射API向一个限定类型的`ArrayList&lt;Integer&gt;`中添加一个字符串元素。通常情况下,直接向此类集合中添加不同类型的元素(如字符串)会导致编译错误。但通过反射API可以绕过类型检查限制,...

    Java面试题大全

    String是一个对象,不属于基本数据类型,它是类`java.lang.String`的实例。 - 字符串操作包括反转和替换。反转可以通过两个指针,一个从后往前遍历,一个从前往后遍历来实现;替换则可以使用`replace()`或`...

    characterString_java_in_character_string_

    在Java编程语言中,字符(Character)是基本的数据类型之一,用于处理单个字符。`characterString_java_in_character_string_`这个标题暗示我们将探讨如何在Java中处理字符字符串,特别是查找字符串中的特定字符。...

    Java中replace、replaceAll和replaceFirst函数的用法小结

    Java中的`replace`、`replaceAll`和`replaceFirst`是字符串操作中常见的方法,用于替换字符串中的特定子串。它们都是`String`类的方法,但各自有不同的行为和用途。 1. `replace(CharSequence target, CharSequence...

Global site tag (gtag.js) - Google Analytics