替换字符串中的许多字符的有效方法是什么?

Java中的字符串处理是我努力学习做得好的事情。 目前我想接受一个字符串并替换我找到的任何字符。

这是我目前效率低下的(有点愚蠢的IMO)function。 它写的只是工作。

public String convertWord(String word) { return word.toLowerCase().replace('á', 'a') .replace('é', 'e') .replace('í', 'i') .replace('ú', 'u') .replace('ý', 'y') .replace('ð', 'd') .replace('ó', 'o') .replace('ö', 'o') .replaceAll("[-]", "") .replaceAll("[.]", "") .replaceAll("[/]", "") .replaceAll("[æ]", "ae") .replaceAll("[þ]", "th"); } 

我运行了1.000.000次,耗时8182ms。 那么我应该如何进行更改此function以提高效率呢?

解决方案:

将函数转换为此函数

 public String convertWord(String word) { StringBuilder sb = new StringBuilder(); char[] charArr = word.toLowerCase().toCharArray(); for(int i = 0; i < charArr.length; i++) { // Single character case if(charArr[i] == 'á') { sb.append('a'); } // Char to two characters else if(charArr[i] == 'þ') { sb.append("th"); } // Remove else if(charArr[i] == '-') { } // Base case else { sb.append(word.charAt(i)); } } return sb.toString(); } 

运行此function1.000.000次需要518ms。 所以我觉得这很有效率。 谢谢你的帮助:)

您可以创建一个String []表,其长度为Character.MAX_VALUE。 (包括映射到小写)

随着替换变得更加复杂,执行它们的时间将保持不变。

 private static final String[] REPLACEMENT = new String[Character.MAX_VALUE+1]; static { for(int i=Character.MIN_VALUE;i<=Character.MAX_VALUE;i++) REPLACEMENT[i] = Character.toString(Character.toLowerCase((char) i)); // substitute REPLACEMENT['á'] = "a"; // remove REPLACEMENT['-'] = ""; // expand REPLACEMENT['æ'] = "ae"; } public String convertWord(String word) { StringBuilder sb = new StringBuilder(word.length()); for(int i=0;i 

我的建议是:

  • 将String转换为char []数组
  • 运行数组,逐个测试每个字符(例如使用switch语句)并在需要时替换它
  • 将char []数组转换回String

我认为这可能是您在纯Java中获得的最快性能。

编辑:我注意到你正在做一些改变字符串长度的更改。 在这种情况下,同样的原则适用,但是您需要保留两个数组并分别增加源索引和目标索引。 如果用完目标空间,您可能还需要调整目标数组的大小(即重新分配更大的数组并将现有目标数组进行arraycopy)

我的实现基于查找表。

 public static String convertWord(String str) { char[] words = str.toCharArray(); char[] find = {'á','é','ú','ý','ð','ó','ö','æ','þ','-','.', '/'}; String[] replace = {"a","e","u","y","d","o","o","ae","th"}; StringBuilder out = new StringBuilder(str.length()); for (int i = 0; i < words.length; i++) { boolean matchFailed = true; for(int w = 0; w < find.length; w++) { if(words[i] == find[w]) { if(w < replace.length) { out.append(replace[w]); } matchFailed = false; break; } } if(matchFailed) out.append(words[i]); } return out.toString(); } 

我的第一选择是使用StringBuilder因为你需要从字符串中删除一些字符。

第二种选择是迭代抛出字符数组并将处理过的字符添加到字符串的另一个数组中。 然后,您需要复制数组以修剪可能未使用的位置。

在那之后,我会做一些性能测试,看看女巫更好。

我怀疑,你真的可以加速’角色替换’。 对于正则表达式替换的情况,您可以预先编译正则表达式

使用函数String.replaceAll。 与您想要的相似的好文章: 链接

每当我们遇到这样的问题时,我们使用正则表达式它们是迄今为止处理你想要做的事情的最快方法。

你有没有试过正则表达式?

我认为效率低下的是你要再次检查已被替换的字符,这是没用的。

我会得到String实例的charArray,迭代它,并为每个字符垃圾邮件一系列if-else像这样:

 char[] array = word.toCharArray(); for(int i=0; i