2011-09-28 69 views
1

我正在创建一个自定义字段,我想用图片替换一些unicode字符。它就像做黑莓手机的表情符号一样。那么我有一个问题,循环编辑字段中的字符,并用图像替换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字符,而不必每次循环查找它们?他们的另一种方式比我错过了吗?

我需要此问题的帮助。在此先感谢

+0

你能更明确一点:你什么时候走出循环?你检查什么条件? –

+0

字符完成后,我退出循环。这是for循环 –

回答

8

那么你正在创建一个新的角色在循环,字符串转换为字符数组开始的每次迭代的新字符串。您还在循环中使用字符串连接,而不是使用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

4

什么需要时间是字符串连接。

字符串在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(); 
+0

这是java-me - 我怀疑StringBuilder是否可用... –

+0

啊,是的。我没有看到java-me标签。 @Farid Farhat:在java-me环境中用StringBuffer替换StringBuilder。 –

+0

RIM没有提供StringBuilder API –

0

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

如果用户正在添加文本你可以存储你以前的时间扫描并从那里开始最后的位置..

在插入/删除你需要获取插入符位置和扫描删除/插入部分也可能是周围的字符(如果你有字符组而不是单个字符被替换)。

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