2017-01-19 4 views
-1

Я пишу программу для удаления последовательных символов повторяющихся в строке, используя ниже программы:Хотя цикл с булевым не завершением

static void main(String[] args){ 

String s = "abcdeedcbfgf"; 
removeConsecutiveDuplicate(s); 

} 

    static void removeConsecutiveDuplicate(String s) { 
     String tmp = ""; 
     boolean isEligible = false; 
     for (int i = 0; i < s.length() - 1; i++) { 
      if (s.charAt(i) == s.charAt(i + 1)) { 
       tmp = s.substring(0, i) + s.substring((i + 2), s.length()); 
       System.out.println(tmp); 
       s = tmp; 
       isEligible = true; 
       break; 
      } 
     } 

     System.out.println("s is:" + s); 
     while (isEligible) 
      removeConsecutiveDuplicate(s); 
    } 

Вывод должен быть: AFGF, когда нет последовательных символов и он должен остановитесь, пока я использую флаг. Но флаг получает истинную ценность.

Я не знаю, как это делается?

Может ли кто-нибудь помочь мне понять, где я делаю что-то неправильно?

+0

Это потому, что 'isEligible' никогда не изменяет значение в фрейме, которое было объявлено первым. Как долго это будет продолжаться? потому что мне кажется, что вы в конечном итоге закончите кучу очень быстро – CraigR8806

+3

i.e каждый раз, когда вы вызываете 'removeConsecutiveDuplicate()', вы создаете новую область и новое значение для 'isEligible'. Это новое значение будет ** НЕ ** возвращаться и не будет отображаться в вашем исходном цикле while – CraigR8806

+0

Строка '' 'в' main() 'останется после вызова (когда вы сделаете ее по желанию и возвращение впоследствии). Я думаю, вы хотите, чтобы метод возвращал измененные '' 'вызывающему. –

ответ

1

Исправление для возвращения новую строку из метода:

static String removeConsecutiveDuplicate(String s) { 
    // existing code, except... 
    return tmp; 
} 

Тогда в вызывающем методе, проверьте, если он изменился:

String s = "abcdeedcbfgf"; 

while (true) { 
    String next = removeConsecutiveDuplicate(s); 
    if (next.equals(s)) 
     break; 
    s = next; 
} 

Удалить переменную и концепцию от isEligible полностью.


Кроме того, вам не нужно указать второй параметр для substring(), потому что если опустить «до конца строки» подразумевается, что:

s.substring(i, s.length()) 

идентичен

s.substring(i); 
+0

s.substring (i, s.length) удалит неидентичные символы. Прочтите ниже код:

 String removeConsecutiveDuplicate(String s){ \t String tmp = ""; \t \t for (int i = 0; i < s.length() - 1; i++) { \t \t if (s.charAt(i) == s.charAt(i + 1)) { \t \t \t tmp = s.substring(i, s.length()); \t \t \t System.out.println("tmp is:"+tmp); \t \t \t break; \t \t } \t } \t return tmp; \t }
Это не сработает. –

+0

О, вам все еще нужно 's.substring (0, i)'. Вы можете сделать 's.substring (0, i) + s.substring (i + 2)', оставив второй аргумент во втором вызове 'substring()'. –

+0

@Bohemian: Спасибо за решение. Это действительно помогло. Можете ли вы также объяснить, почему я не могу использовать «while loop» так, как я использовал? И то, как вы использовали, работает. В противном случае цикл while, который вы использовали, должен стать бесконечным циклом. –

1

Пока цикл while (true). Вы никогда не делаете это ложным. Как только это верно, вы выполняете бесконечный цикл. изменение время до если. while (iseligible) => если (приемлемо).

+0

Нет, я так не думаю. У искателя есть условие 'i

+0

oops !! моя вина . Изменен ответ Теперь. Спасибо @Ole V.V. – BloomBlack

+0

Это сработало, когда я изменил время до IF. Но я не могу понять, как это сделать? Является ли оно while или If, когда я делаю вызов рекурсии, isEligible меняется на false. Вы можете мне помочь? –