我编写了以下代码,但类似的字符总是在同一个案例中。这段代码有什么问题,如何解决这个问题?
private void genBTActionPerformed(java.awt.event.ActionEvent evt) {
String str = new String(strTF.getText());
int n = str.length();
char ch;
int i;
for(i = 0; i < n; i++) {
if(i % 2 == 0) {
ch = Character.toLowerCase(str.charAt(i));
str = str.replace(str.charAt(i), ch);
} else {
ch = Character.toUpperCase(str.charAt(i));
str = str.replace(str.charAt(i), ch);
}
}
jumTF.setText(str);
}
答案 0 :(得分:6)
与其名称不同,.replace()
会替换整个输入中的字符/ CharSequence
。与.replaceAll()
的区别在于它将文字作为参数而不是正则表达式/正则表达式替换字符串(并且它有一个重载,将两个char
作为参数)。这是String
之后matches()
类的第二个错误命名方法。
此外,您在替换的每个字符上创建一个新的String
,因此对于一个n字符长的字符串,您有n + 1个字符串。这样做是这样的:
final char[] chars = str.toCharArray();
final int len = chars.length;
char c;
for (int i = 0; i < len; i++) {
c = chars[i];
chars[i] = i % 2 == 0
? Character.toLowerCase(c)
: Character.toUpperCase(c);
}
jumTF.setText(new String(chars));
答案 1 :(得分:0)
在你的程序中,你使用replace()替换整个输入中的字符/ CharSequences你需要做的是
将该数组转换回字符串
private void genBTActionPerformed(java.awt.event.ActionEvent evt){
String str = new String(strTF.getText()); char [] chr= str.toCharArray(); int n = chr.length; char ch; int i; for(i = 0; i < n; i++) { if(i % 2 == 0) { ch = Character.toLowerCase(chr[i]); chr[i]=ch; } else { ch = Character.toUpperCase(chr[i]); chr[i]=ch; } } jumTF.setText(new String(chr)); }
希望这会对你有所帮助:)。
答案 2 :(得分:0)
由于 String 在java中是 immutable ,您可以使用 StringBuilder或StringBuffer 来解决此问题
StringBuilder str=new StringBuilder(inputString);
您只需轻微更改即可使用自己的逻辑,而不是使用
str = str.replace(str.charAt(i), ch);//since it replaces in whole string
使用
str.setCharAt(i,ch);
所以你的最终计划如下:
for(i = 0; i < n; i++) {
if(i % 2 == 0) {
ch = Character.toLowerCase(str.charAt(i));
str.setCharAt(i,ch);
} else {
ch = Character.toUpperCase(str.charAt(i));
str.setCharAt(i,ch);
}
}
假设InputString为:stackoverflow
然后输出是:sTaCkOvErFlOw