浏览 3022 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-10-29
以下是测试程序运行结果: /** * <b>字符串删除其中某字符</b><br/> * 本方法用来移除指定字符串中的指定字符。 * 在 Java 6.0 以内,删除字符串中的指定字符,需要通过 * {@link String#replace(CharSequence, CharSequence) replace} 方法,将指定单 * 字符的字符串,替换成空字符串来实现。而 <code>replace</code> 方法为了追求通用, * 使用了正则表达式参数。即便是编译过的正则表达式,其性能也无法与简单的字符相等 * 判断相提并论。<br/> * 本方法不涉及正则表达式,通过 {@link StringBuilder} 来删除原字符串中的目标 * 字符。是一个简单但高效的方法。<br/> * 本方法使用示例如下: * <pre> * String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; * String removed = StringTool.removeChar(source, ' ');</pre> * 此示例中,{@link String} source 为原字符串。String removed 为删除空格后的 * 结果。 * @see String#replace(CharSequence, CharSequence) * @see StringBuilder#deleteCharAt(int) * @param source 待被处理的字符串,即本方法的“原字符串” * @param target 需要从原字符串中移除的字符 * @return 从指定原字符串中移除指定字符后所得的结果字符串 * @exception NullPointerException 当传入参数 source 为空时 */ static public String removeChar(String source, char target) { StringBuilder builder = new StringBuilder(source); char[] srcChars = source.toCharArray(); int accumulation = 0; for (int index = -1; ++index != srcChars.length; ) if (srcChars[index] == target) builder.deleteCharAt(index - accumulation++); return builder.toString(); }
/** * <b>简易字符串分割</b><br/> * 本方法用来根据指定字符,将某字符串以此为分割,拆分成多个子字符串。 * 对于分割字符串功能,在 Java 6.0 以内,都只提供了支持正则表达式的 * {@link String#split(String) split} 方法。此方法为追求通用,即便是简单的 * 分割,也会基于正则表达式来进行。即便是编译过的正则表达式,其性能也无法与简单 * 的字符相等判断相提并论。<br/> * 本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合分割字符的 * 字符,然后通过 {@link String#substring(int, int)} 来获取每一个分割字符之间 * 的子字符串,存入一个 {@link LinkedList} 中。这是一个功能简单但高效的方法。 * 如果规模比较大,拟考虑先通过一次循环,取得原字符串中分割字符的数量,以此制作 * 定长的 {@link ArrayList} 。 * 本方法尤其适用于常见的由半角逗号结合在一起的字符串的分割。<br/> * 在编写之初,本方法曾采取将字符串的字符数组分段处理,通过系统字符串复制来形成 * 一个个子字符串。后经考证,{@link String#substring(int, int)} 是一个很高效的 * 方法,遂改。效率提高了一倍。 * 本方法使用示例如下: * <pre> * String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; * List<String> secs = StringTool.splitSimpleString(source, ' ');</pre> * 此示例中,{@link String} source 为原字符串。{@link List} secs 为删除空格后 * 的结果。 * @see String#split(String) * @see String#substring(int, int) * @param source 待被处理的字符串,即本方法的“原字符串” * @param gap 分割字符 * @return 从指定原字符按分割字符拆分成的子字符串列表 * @exception NullPointerException 当传入参数 source 为空时 */ static public List<String> splitSimpleString(String source, char gap) { List<String> result = new LinkedList<String>(); char[] sourceChars = source.toCharArray(); String section = null; int startIndex = 0; for (int index = -1; ++index != sourceChars.length; ) { if (sourceChars[index] != gap) continue; section = source.substring(startIndex, index); result.add(section); startIndex = index + 1; } section = source.substring(startIndex, sourceChars.length); result.add(section); return result; }
static public void main(String[] arguments) { // 准备测试内容 String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; System.out.println("source = " + source); int loop = 300000; String resultString = null; List<String> resultList = null; String[] resultArr = null; int index = -1; long start = Calendar.getInstance().getTimeInMillis(); System.out.println("字符串中删除字符的方法。"); // 测试 Java 类库提供的字符串删除某字符 index = -1; while (++index != loop) resultString = source.replace(" ", ""); long end1 = Calendar.getInstance().getTimeInMillis(); System.out.println("系统函数计算 " + loop + " 次用时 " + (end1 - start) + "ms"); // 测试自定义的字符串删除某字符 index = -1; while (++index != loop) resultString = StringTool.removeChar(source, ' '); long end2 = Calendar.getInstance().getTimeInMillis(); System.out.println("自定义方法计算 " + loop + " 次用时 " + (end2 - end1) + "ms"); System.out.println("生成 " + resultString + " 。"); System.out.println("---------- ---------- ---------- ----------\n"); // 测试 Java 类库提供的字符串按某字符分割 System.out.println("字符串按字符分割的方法。"); index = -1; while (++index != loop) resultArr = source.split(" "); long end3 = Calendar.getInstance().getTimeInMillis(); System.out.println("系统函数计算 " + loop + " 次用时 " + (end3 - end2) + "ms"); // 测试自定义的字符串按某字符分割 index = -1; while (++index != loop) resultList = StringTool.splitSimpleString(source, ' '); long end4 = Calendar.getInstance().getTimeInMillis(); System.out.println("自定义方法计算 " + loop + " 次用时 " + (end4 - end3) + "ms"); System.out.println("生成 " + resultArr + ": " + resultList + " 。"); System.out.println("---------- ---------- ---------- ----------\n"); }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-10-29
记录一下,下次回来仔细看看。
|
|
返回顶楼 | |
发表时间:2012-10-29
这里有许多字符串的处理方式http://www.verydemo.com/demo_c119_i646.html
|
|
返回顶楼 | |
发表时间:2012-10-30
很欣赏楼主的动手实践能力,看来不能过于迷信官方的API
|
|
返回顶楼 | |
发表时间:2012-10-30
public static String removeChar1(String str,char target){
char[] srcChars = str.toCharArray(); StringBuilder newSb = new StringBuilder(); for(int i=0;i<srcChars.length;i++){ if(srcChars[i]!=' '){ newSb.append(srcChars[i]); } } return newSb.toString(); } 这个删除方法比楼主的删除方法效率快几十倍哈 |
|
返回顶楼 | |
发表时间:2012-11-03
shenyuc629 写道 public static String removeChar1(String str,char target){
char[] srcChars = str.toCharArray(); StringBuilder newSb = new StringBuilder(); for(int i=0;i<srcChars.length;i++){ if(srcChars[i]!=' '){ newSb.append(srcChars[i]); } } return newSb.toString(); } 这个删除方法比楼主的删除方法效率快几十倍哈 受教了,非常感谢。看来 StringBuilder 的 deleteCharAt 也是即时结算的,涉及到数组内容迁移。 我这边是快 2 倍以上,2.5 倍以下。 请问您咋称呼?我在产品代码中给这个方法留您的名字。 |
|
返回顶楼 | |
发表时间:2012-11-03
|
|
返回顶楼 | |
发表时间:2012-11-05
shenyuc629 写道 public static String removeChar1(String str,char target){
char[] srcChars = str.toCharArray(); StringBuilder newSb = new StringBuilder(); for(int i=0;i<srcChars.length;i++){ if(srcChars[i]!=' '){ newSb.append(srcChars[i]); } } return newSb.toString(); } 这个删除方法比楼主的删除方法效率快几十倍哈 以下是我使用您的算法重写的方法: /** * <b>字符串删除其中某字符</b><br/> * 本方法用来移除指定字符串中的指定字符。 * 在 Java 6.0 以内,删除字符串中的指定字符,需要通过 * {@link String#replace(CharSequence, CharSequence) replace} 方法,将指定单 * 字符的字符串,替换成空字符串来实现。而 <code>replace</code> 方法为了追求通用, * 使用了正则表达式参数。即便是编译过的正则表达式,其性能也无法与简单的字符相等 * 判断相提并论。<br/> * 本方法不涉及正则表达式,通过遍历原字符串对应的字符数组来寻找符合待删除字符的 * 字符,然后通过 {@link StringBuilder} 来追加其余字符。这是一个简单但高效的方法。 * <br/> * 本方法编写之初,曾试图通过 <code>StringBuilder</code> 的功能来直接删除字符串 * 中待删除字符。后经 www.iteye.com 网站用户 shenyuc629 提示,并经过考证,发现 * {@link StringBuilder#deleteCharAt(int) deleteCharAt} 方法并不高效,应该是 * 因为其内部每次删除都进行了数组迁移。遂改为追加方式,效率提高了 2 倍多。<br/>>> * 本方法使用示例如下: * <pre> * String source = "a b c d e f g h i j k l m n o p q r s t u v w x y z"; * String removed = StringTool.removeChar(source, ' ');</pre> * 此示例中,{@link String} source 为原字符串。String removed 为删除空格后的 * 结果。 * @see String#replace(CharSequence, CharSequence) * @see StringBuilder#append(char) * @param source 待被处理的字符串,即本方法的“原字符串” * @param target 需要从原字符串中移除的字符 * @return 从指定原字符串中移除指定字符后所得的结果字符串 * @exception NullPointerException 当传入参数 source 为空时 */ static public String removeChar(String source, char target) { StringBuilder builder = new StringBuilder(); for (char c: source.toCharArray()) if (c != target) builder.append(c); return builder.toString(); } |
|
返回顶楼 | |