2016-02-12 4 views
0

Я нашел очень странную проблему в своей программе java. Я хочу найти индексы всех труб в моей строке и сохранить их в 5 переменных, но результат неправильный. Вот моя программа:Невозможно найти индекс символа в строке java

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

Я не могу сказать, что вопрос от этого. –

+0

Я думаю, что результат должен быть 1 3 5 7 9 – Frankie

+0

'tmp.substring (i, i + 1) .equals (" | ")' должно быть 'tmp.charAt (i) == '|''. – Andreas

ответ

1

Как вы итерацию, первый | будет увеличиваться count к 1, и установить start = 1, но на следующей итерации, когда вы расположены на B , счет еще 1, и 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]); 

выход (от обоих)

1|3|5|7|9 
+0

получить его! Большое спасибо! Только один вопрос, почему я должен использовать tmp.charAt (i), а не tmp.substring (i, i + 1)? Я могу получить правильный результат, используя tmp.substring (i, i + 1). – Frankie

+0

@ Frankie Clarity. Представление. – Andreas

Смежные вопросы