Java эффективный перебор над символом

1

В качестве части моей реализации мне нужно как можно эффективнее выполнить итерацию по символам. Вот часть моего исходного кода, который я написал:

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;

Каков наиболее эффективный способ выполнения такого процесса? Пожалуйста, подумайте, что я не поставил здесь все условия, потому что это было около 600 различных условий. Помимо того, что эта часть кода должна быть запущена для огромных документов, которые имеют огромное количество символов. Поэтому эффективность действительно имеет значение.

  • 1
    У вас будет много условных проверок, но это кажется неизбежным. Я не думаю, что у тебя получится лучше, чем у тебя.
Теги:
performance
iteration

1 ответ

6
Лучший ответ

Если все константы в ваших утверждениях и присваиваниях 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]];
  • 0
    Работает ли он более эффективно, чем коммутатор?
  • 3
    @ Алин, убедитесь, что вы не стали жертвой преждевременной оптимизации !
Показать ещё 11 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню