String 在字符串中循环查找Unicode字符花费了太多时间
我正在创建一个自定义字段,希望在其中用图片替换一些unicode字符。这就像为黑莓手机做表情符号一样。我在编辑字段中循环字符并用图像替换unicode字符时遇到问题。当文本变得太长时,循环会花费太多时间 我的代码如下:String 在字符串中循环查找Unicode字符花费了太多时间,string,blackberry,java-me,String,Blackberry,Java Me,我正在创建一个自定义字段,希望在其中用图片替换一些unicode字符。这就像为黑莓手机做表情符号一样。我在编辑字段中循环字符并用图像替换unicode字符时遇到问题。当文本变得太长时,循环会花费太多时间 我的代码如下: String aabb = ""; char[] chara = this.getText().toCharArray(); for (int i = loc; i < chara.length; i ++) { Character cc = new Characte
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
}
}
字符串aabb=”“;
char[]chara=this.getText().toCharArray();
对于(int i=loc;i
这很好,图像放在正确的位置。但问题是当文本变大时,循环占用了太多时间,并且文本在设备上的输入变得不友好
如何在文本中查找unicode字符,而不必每次循环查找?他们是不是我错过的另一条路
在这个问题上我需要帮助。提前感谢在循环的每次迭代中,您将创建一个新字符和一个新字符串,并将该字符串转换为一个字符数组。您还在循环中使用字符串连接,而不是使用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
}
}
String text=this.getText();
StringBuffer=新的StringBuffer(text.length());
对于(int i=0;i127){//或任何
//采取行动
}
}
我假设“采取一些行动”将在某些方面改变缓冲区,否则缓冲区当然毫无意义。。。但从根本上说,这可能是你想要的改变
循环中的字符串串联是一个特别糟糕的主意-请参见我的。在循环的每次迭代中创建一个新字符和一个新字符串,并将字符串转换为字符数组。您还在循环中使用字符串连接,而不是使用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
}
}
String text=this.getText();
StringBuffer=新的StringBuffer(text.length());
对于(int i=0;i127){//或任何
//采取行动
}
}
我假设“采取一些行动”将在某些方面改变缓冲区,否则缓冲区当然毫无意义。。。但从根本上说,这可能是你想要的改变
循环中的字符串连接是一个特别糟糕的主意-请参见我的。需要时间的是字符串连接 字符串在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();
StringBuilder=newstringbuilder(this.getText().length()+100);//尺寸估算
char[]chara=this.getText().toCharArray();
对于(int i=loc;i
需要时间的是字符串连接
字符串在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();
StringBuilder=newstringbuilder(this.getText().length()+100);//尺寸估算
char[]chara=this.getText().toCharArray();
对于(int i=loc;i
好吧,除了加快循环外,您还可以尝试最小化工作负载
如果用户正在追加文本,您可以存储上次扫描的位置,然后从那里开始
在插入/删除时,您需要获取插入符号位置并扫描删除/插入的部分,可能还有周围的字符(如果您有字符组而不是被替换的单个字符)
但是,修复循环性能可能会给您的情况带来更好的改进,因为我怀疑您是否会有那么长的字符串使算法更改变得有价值。好吧,除了加快循环速度外,您还可以尝试最小化工作负载 如果用户正在追加文本,您可以存储上次扫描的位置,然后从那里开始 在插入/删除时,您需要获取插入符号位置并扫描删除/插入的部分,可能还有周围的字符(如果您有字符组而不是被替换的单个字符)
不过,修复循环性能可能会给您带来更好的改进,因为我怀疑您是否会有这么长的字符串使算法更改变得有价值。最重要的性能增强已经说明,但反向循环也会在BlackBerry应用中有所帮助
最重要的性能增强已经提到,但反向循环也将有助于黑莓应用
你能说得更清楚一点吗:你什么时候才能摆脱这种循环?你在检查什么情况?我不在回路里了