Óla*_*age 26 java string optimization
Java中的字符串处理是我努力学习做得好的事情.目前我想要一个字符串并替换我找到的任何字符.
这是我目前效率低下的(有点愚蠢的IMO)功能.它写的只是工作.
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");
}
Run Code Online (Sandbox Code Playgroud)
我运行了1.000.000次,耗时8182ms.那么我应该如何进行更改此功能以提高效率呢?
解决方案:
将函数转换为此函数
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();
}
Run Code Online (Sandbox Code Playgroud)
运行此功能1.000.000次需要518ms.所以我认为这足够有效.谢谢你的帮助:)
Pet*_*rey 20
您可以创建一个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<word.length();i++)
sb.append(REPLACEMENT[word.charAt(i)]);
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
我的建议是:
我认为这可能是您在纯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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19976 次 |
最近记录: |