【问题标题】:Java efficient iterating over charJava高效迭代char
【发布时间】:2015-06-16 23:08:48
【问题描述】:

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

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 个不同的条件。除了考虑这部分代码应该针对具有大量字符的大型文档运行。所以效率真的很重要。

【问题讨论】:

  • 你会有很多条件检查,但这似乎是不可避免的。我不认为你会比你做得更好。

标签: java performance iteration


【解决方案1】:

如果你的case语句和赋值中的所有常量都是chars,你可以使用一个数组将源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]];

【讨论】:

  • 它的执行效率是否比 switch case 更高?
  • @Alin 确保您没有成为premature optimization 的受害者!
  • @Alin 我相信它应该,因为从数组中获取元素应该比具有许多条件的 switch 语句更快。它还使代码更简洁,我认为这一点更为重要(因为性能提升不一定是可观的)。
  • @Alin Java 有时在优化 switch 语句方面非常聪明,如果幸运的话,它甚至可能最终得到这样一个数组。由于使用数组更清晰,并且肯定至少与开关一样快,所以我总是会选择它。 +++ 这么大的 switch 语句的一个问题是它有很多代码,并且可能在某个地方隐藏了一个惊喜,例如,case AR_D8: s[i++]= FA_D8;
  • @Eran 如果字符代码指向两个不同的字符怎么办?例如 '\ufefc' 指向两个字符,应该替换为 '\u0644' 和 '\u0627' 的串联。
猜你喜欢
  • 2011-08-15
  • 2013-02-14
  • 2021-07-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多