Java高效的字符迭代
作为实现的一部分,我需要尽可能高效地实现对字符的迭代。以下是我编写的源代码的一部分:Java高效的字符迭代,java,performance,iteration,Java,Performance,Iteration,作为实现的一部分,我需要尽可能高效地实现对字符的迭代。以下是我编写的源代码的一部分: public int normalize(char s[], int len) { for (int i = 0; i < len; i++) { switch (s[i]) { //numbers case EN_D0: case AR_D0: s[i]= FA_D0;
public int normalize(char s[], int len) {
for (int i = 0; i < len; i++) {
switch (s[i]) {
//numbers
case EN_D0:
case AR_D0:
s[i]= FA_D0;
break;
case EN_D1:
case AR_D1:
s[i]= FA_D1;
break;
case EN_D2:
case AR_D2:
s[i]= FA_D2;
break;
case EN_D3:
case AR_D3:
s[i]= FA_D3;
break;
case EN_D4:
case AR_D4:
s[i]= FA_D4;
break;
case EN_D5:
case AR_D5:
s[i]= FA_D5;
break;
case EN_D6:
case AR_D6:
s[i]= FA_D6;
break;
case EN_D7:
case AR_D7:
s[i]= FA_D7;
break;
case EN_D8:
case AR_D8:
s[i]= FA_D8;
break;
case EN_D9:
case AR_D9:
s[i]= FA_D9;
break;
//Symboles
case EN_QUESTION_MARK:
s[i]=FA_QUESTION_MARK;
break;
case EN_PERCENT_SIGN:
s[i]=FA_PERCENT_SIGN;
break;
case EN_DASH1:
case EN_DASH2:
case EN_DASH3:
case EN_DASH4:
s[i]=FA_DASH;
break;
case HAMZA_ABOVE:
len = delete(s, i, len);
i--;
break;
default:
break;
}
}
return len;
public int规范化(char s[],int len){
对于(int i=0;i
这样做的最有效的方法是什么?请考虑我没有把所有的条件都放在这里,因为它大约有600种不同的条件。此外,考虑到这部分代码应该运行在具有巨大字符量的巨大文档中。所以效率确实很重要。您的case语句和赋值是
char
s,您可以使用数组将源char
映射到目标char
。数组的长度为2^16
char[] map = new char[65536];
...
map[AR_D7] = FA_D7;
...
map[AR_D9] = FA_D9;
...
然后,循环变成:
for (int i = 0; i < len; i++)
s[i] = map[s[i]];
for(int i=0;i
如果case语句和赋值中的所有常量都是char
s,则可以使用数组将源char
映射到目标char
。数组的长度为2^16
char[] map = new char[65536];
...
map[AR_D7] = FA_D7;
...
map[AR_D9] = FA_D9;
...
然后,循环变成:
for (int i = 0; i < len; i++)
s[i] = map[s[i]];
for(int i=0;i
你会有很多条件检查,但这似乎是不可避免的。我不认为你会比你做得更好。你会有很多条件检查,但这似乎是不可避免的。我不认为你会比你做得更好。它是否比开关盒更有效?@Alin确保你不会成为受害者!@Alin我相信是这样的uld,因为在许多情况下,从数组中获取元素应该比switch语句快。它还使代码更加简洁,我认为这一点更为重要(因为性能增益不一定很大)@Alin Java有时在优化switch语句方面非常聪明,如果你幸运的话,它甚至可能最终得到这样一个数组。由于使用数组更清晰,而且肯定至少和switch一样快,我总是这样做的。+++如此大的switch语句的一个问题是,它有很多代码,可能隐藏着一个惊喜例如,案例AR_D8:s[i++]=FA_D8;
@Eran如果字符代码指向两个不同的字符怎么办?例如“\ufefc”指向两个字符,应该替换为“\u0644”和“\u0627”的串联。它的执行效率是否比switch case更高?@Alin请确保您不会成为受害者!@Alin我认为应该,因为从数组中获取元素应该在许多情况下,它比switch语句更快。它还使代码更简洁,我认为这一点更为重要(因为性能增益不一定很大)@Alin Java有时在优化switch语句方面非常聪明,如果你幸运的话,它甚至可能最终得到这样一个数组。由于使用数组更清晰,而且肯定至少和switch一样快,我总是这样做的。+++如此大的switch语句的一个问题是,它有很多代码,可能隐藏着一个惊喜例如,case AR_D8:s[i++]=FA_D8;
@Eran如果字符代码指向两个不同的字符会怎样?例如'\ufefc'指向两个字符,并应替换为'\u0644'和'\u0627'的串联。