我的问题是如何取代每一个第三个&#39 ;;'从一个字符串a put a','在这个位置?
例如:
String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53"
使字符串看起来像:
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
我试图像这样解决它,但我不能用charAt(i)将其替换为其他字符。
int counter =0;
for (int i=0;i<s.length();i++){
if(s.charAt(i) == ';'){
counter++;
}
if(counter ==3){
s.charAt(i)=',';
counter =0;
}
}
答案 0 :(得分:4)
正常情况下,问题需要一些自己的努力,但正则表达式很难。
s = s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");
0分钟或更多分号的序列,后跟分号等。
[^ ...characters... ]
列出了
...*
是前一场比赛的零或更多。
第一组(...)
的匹配在$1
中给出,因此实际上只有最后一个分号被逗号替换。
答案 1 :(得分:2)
不像@Joop那样优雅,但可能更容易理解:
String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
char[] chars = s.toCharArray();
int counter = 1;
for (int i = 0; i < chars.length; i++){
if (chars[i] == ';'){
if (counter == 3){
chars[i] = ','; // replace ';' with ','
counter = 1; // set counter to 1
}else {
counter++;
}
}
}
String output = String.valueOf(chars);
System.out.println(output); // RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
答案 2 :(得分:2)
您可以使用modulo%运算符来了解第三次发生的事情。并在字符串和char数组之间进行简单的转换以完成剩下的工作:
class Main {
public static void main(String[] args) {
String s1 = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
char [] s = s1.toCharArray();
int j=0;
for(int i=0;i<s.length;i++){
if (s[i]==';') {
j++;
if(j % 3 == 0) {
s[i] = ',';
}
}
}
System.out.println(s);
}
}
答案 3 :(得分:2)
正如我在comment中所建议的,有很多方法可以做到这一点。以下是我建议的实现,但当然有更多的方法。
从代码的角度来看,第一个是最简单的,如果你知道正则表达式。有关说明,请参阅answer by Joop Eggen。
第二个可能是最快的,特别是如果您通过将%
重置为0来消除j
模运算符。
private static String usingRegex(String s) {
return s.replaceAll("([^;]*;[^;]*;[^;]*);", "$1,");
}
private static String usingCharArray(String s) {
char[] arr = s.toCharArray();
for (int i = 0, j = 0; i < arr.length; i++)
if (arr[i] == ';' && ++j % 3 == 0)
arr[i] = ',';
return new String(arr);
}
private static String usingStringBuilder(String s) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0, j = 0; i < sb.length(); i++)
if (sb.charAt(i) == ';' && ++j % 3 == 0)
sb.setCharAt(i, ',');
return sb.toString();
}
private static String usingSubstring(String s) {
int i = -1, j = 0;
while ((i = s.indexOf(';', i + 1)) != -1)
if (++j % 3 == 0)
s = s.substring(0, i) + ',' + s.substring(i + 1);
return s;
}
测试
String s = "RED;34;34;BLUE;44;44;GREEN;8;8;BLUE;53;53";
System.out.println(usingRegex(s));
System.out.println(usingCharArray(s));
System.out.println(usingStringBuilder(s));
System.out.println(usingSubstring(s));
输出
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53
RED;34;34,BLUE;44;44,GREEN;8;8,BLUE;53;53