Java高效迭代char

Ali*_*i n 1 java iteration performance

作为我实现的一部分,我需要尽可能高效地实现对字符的迭代.这是我写的源代码的一部分:

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;
Run Code Online (Sandbox Code Playgroud)

这种过程最有效的方法是什么?请考虑我没有把所有条件都放在这里,因为它有大约600种不同的条件.除了考虑应该为具有大量字符的大型文档运行这部分代码.所以效率真的很重要.

Era*_*ran 6

如果case语句和赋值中char的所有常量都是s,则可以使用数组将source映射char到target char.数组的长度是2^16.

char[] map = new char[65536];

...
map[AR_D7] = FA_D7;
...
map[AR_D9] = FA_D9;
...
Run Code Online (Sandbox Code Playgroud)

然后你循环变成:

for (int i = 0; i < len; i++)
    s[i] = map[s[i]];
Run Code Online (Sandbox Code Playgroud)

  • @Alin确保你不会成为[过早优化]的受害者(http://c2.com/cgi/wiki?PrematureOptimization)! (3认同)