2015-04-11 3 views
1

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

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

Вы будете иметь много условных проверок, но это кажется неизбежным. Я не думаю, что ты сделаешь лучше, чем у тебя. – egracer

ответ

6

Если все константы в вашем случае заявления и задания являются 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

@Alin убедитесь, что вы не стали жертвой [преждевременной оптимизации] (http://c2.com/cgi/wiki?PrematureOptimization)! – Qix

+1

@Alin Я считаю, что это нужно, так как получение элемента из массива должно быть быстрее, чем оператор switch со многими условиями. Это также делает код более кратким, что, я думаю, еще более важно (поскольку прирост производительности не обязательно будет существенным). – Eran