【问题标题】:Looping in a String to find Unicode characters is taking too much time在字符串中循环查找 Unicode 字符需要太多时间
【发布时间】:2011-09-28 07:21:58
【问题描述】:

我正在创建一个自定义字段,我想用图片替换一些 unicode 字符。就像为黑莓设备做表情一样。好吧,我在编辑字段中循环字符并用图像替换 unicode 字符时遇到问题。当文本变得太长时,循环会花费太多时间。

我的代码如下:

String aabb = "";
char[] chara = this.getText().toCharArray();
for (int i = loc; i < chara.length; i ++) {
   Character cc = new Character(chara[i]);
   aabb += cc.toString();
   if (unicodeCaracter) {
       //Get the location
       //draw the image in the appropriate X and Y
   }
}

嗯,这很好用,并且图像放置在正确的位置。但问题是当文本变大时,循环耗时过长,设备上的文本输入变得不友好。

如何在文本中找到 unicode 字符,而不必每次都为它们循环?他们是我错过的另一种方式吗?

我需要有关此问题的帮助。提前致谢

【问题讨论】:

  • 你能更明确一点:你什么时候跳出循环?你在检查什么条件?
  • 角色完成后我退出了循环。这就是for循环

标签: string blackberry java-me


【解决方案1】:

好吧,您正在循环的每次迭代中创建一个新字符一个新字符串,将字符串转换为字符数组以开始。您还在循环中使用字符串连接,而不是使用 StringBuffer。所有这些都会损害性能。

这里的“Unicode 字符”是什么意思并不明显——Java 中的 所有 字符都是 Unicode 字符。我怀疑你真的想要这样的东西:

String text = this.getText();
StringBuffer buffer = new StringBuffer(text.length());
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    buffer.append(c);
    if (c > 127) { // Or whatever
        // Take some action
    }
}

我假设“采取一些行动”会在某些方面改变缓冲区,否则缓冲区当然毫无意义......但从根本上说,这可能是改变你的排序想要。

循环中的字符串连接是一个特别是的坏主意 - 请参阅我的article on it for more details

【讨论】:

    【解决方案2】:

    需要时间的是字符串连接。

    字符串在 Java 中是不可变的。每次你这样做

    aabb += cc.toString();
    

    您创建一个新的 String 对象,其中包含前一个字符的所有字符,这些字符必须被垃圾回收,再加上新的字符。使用 StringBuilder 构建您的字符串:

    StringBuilder builder = new StringBuilder(this.getText().length() + 100); // size estimation
    char[] chara = this.getText().toCharArray();
    for (int i = loc; i < chara.length; i++) {
       builder.append(chara[i]);
       if (unicodeCaracter) {
           //Get the location
           //draw the image in the appropriate X and Y
       }
    }
    String aabb = builder.toString();
    

    【讨论】:

    • 啊,是的。我没有看到 java-me 标签。 @Farid Farhat:只需在 java-me 环境中将 StringBuilder 替换为 StringBuffer 即可。
    • RIM没有提供StringBuilder API
    • 是的,这就是为什么我刚刚告诉你用 StringBuffer 替换 StringBuilder。
    【解决方案3】:

    嗯,除了加快你的循环,你也可以尝试减少工作量。

    如果用户正在附加文本,您可以存储您之前扫描的最后一个位置并从那里开始..

    在插入/删除时,您需要获取插入符号的位置并扫描已删除/插入的部分以及周围的字符(如果您有字符组而不是被替换的单个字符)。

    但是,修复循环性能可能会给您的情况带来更好的改进,因为我怀疑您是否会有那么长的字符串来使算法更改值得。

    【讨论】:

      【解决方案4】:

      已经说明了最重要的性能增强,但向后循环也将有助于 BlackBerry 应用程序。

      Programming Tips: General Coding Tips

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        相关资源
        最近更新 更多