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'的串联。