我在java程序中发现了一个非常奇怪的问题。我想在我的字符串中查找所有管道的索引并将它们保存为5个变量,但结果不正确。这是我的计划:
public class forTest {
public static void main(String[] args){
String tmp = "A|B|C|D|E|F|";
int count = 0;
int start = 0;
int start1 = 0;
int start2 = 0;
int start3 = 0;
int start4 = 0;
for(int i = 0; i < tmp.length(); i++){
if(tmp.substring(i, i+1).equals("|")){
count = count + 1;
System.out.println(i);
}
if(count == 1){
start = i;
}
if(count == 2){
start1 = i;
}
if(count == 3){
start2 = i;
}
if(count == 4){
start3 = i;
}
if(count == 5){
start4 = i;
}
}
System.out.println(start + "|" +start1 + "|" +start2
+ "|" +start3 + "|" +start4);
}
输出:
Result is 1
1 3 5 7 9 11
2|4|6|8|10
答案 0 :(得分:1)
在您进行迭代时,第一个|
会将count
增加到1
,并设置start = 1
,但是当您定位在{{1 },计数仍为1,B
更新为start
。
2
上的断点调试会让您自己看到这个!
解决方案:将所有start = i;
语句移到第一个语句中。
此外,if
应为tmp.substring(i, i+1).equals("|")
,并使用tmp.charAt(i) == '|'
。
else if
替代解决方案
使用正则表达式可以使用较短的代码来获得相同的结果:
for (int i = 0; i < tmp.length(); i++) {
if (tmp.charAt(i) == '|') {
count = count + 1;
System.out.println(i);
if (count == 1) {
start = i;
} else if (count == 2) {
start1 = i;
} else if (count == 3) {
start2 = i;
} else if (count == 4) {
start3 = i;
} else if (count == 5) {
start4 = i;
}
}
}
或者如果您不喜欢,可以使用数组:
String tmp = "A|B|C|D|E|F|";
String regex = "(\\|).*?(\\|).*?(\\|).*?(\\|).*?(\\|)";
Matcher m = Pattern.compile(regex).matcher(tmp);
if (m.find()) {
int start = m.start(1);
int start1 = m.start(2);
int start2 = m.start(3);
int start3 = m.start(4);
int start4 = m.start(5);
System.out.println(start + "|" +start1 + "|" +start2 + "|" +start3 + "|" +start4);
}
输出(来自两者)
String tmp = "A|B|C|D|E|F|";
int count = 0;
int[] start = new int[5];
for (int i = 0; i < tmp.length(); i++)
if (tmp.charAt(i) == '|' && count < start.length)
start[count++] = i;
System.out.println(start[0] + "|" +start[1] + "|" +start[2] + "|" +start[3] + "|" +start[4]);