2015-03-10 2 views
-1
public class PersonName { 
    public static int NumberNames(String wholename) 
    { // store the name passed in to the method 
     String testname = wholename; 
     // initialize number of names found 
     int numnames = 0; 
     // on each iteration remove one name 
     while (testname.length() > wholename.length()) 
     { // take the "white space" from the beginning and end 
      testname = testname.trim(); 
      // determine the position of the first blank 
      // .. end of the first word 
      int posBlank = testname.indexOf(' ');   
      // cut off word 
      testname=testname.substring(posBlank + 1, testname.length()); 
      System.out.println(numnames); 
      System.out.println(testname); 
      numnames++;   
     }  
     return numnames; 
    } 

    public static void main(String args[]) 
    { 
     PersonName One= new PersonName(); 

     System.out.println(One.NumberNames("Bobby")); 
     System.out.println(One.NumberNames("Bobby Smith")); 
     System.out.println(One.NumberNames("Bobby L. Smith")); 
     System.out.println(One.NumberNames(" Bobby Paul Smith Jr. ")); 
    } 
} 

Код должен принимать указанные строки и выводить результат с указанием количества строк. Я так много до сих пор, но цикл застрял где-то в методе «PersonName». Кто-нибудь знает, почему он застрял?Количество счетчиков строк, но застряло в бесконечном цикле

+5

Это условие никогда не будет истинным 'while (testname.length()> wholename.length())' the testname' и 'wholename' всегда будут иметь длину в начале из-за назначения. Я не уверен, как он даже начал цикл? – ProfessionalAmateur

+1

Как всегда в подобных ситуациях отладчик - ваш друг. – Holloway

+1

Пожалуйста, скажите мне, что это домашняя работа, и вам не разрешено использовать String.split() – Adam

ответ

0

Ваша проблема связана с состоянием петли:

while (testname.length() > 0) // this will always be true and is causing your infinite loop 

Я не уверен, что вы пытаетесь достичь здесь, но это почему ваша программа «застревают».

0

в то время (testname.length()> wholename.length())

Ваш цикл, пока будет верно до тех пор, как количество символов в АСМАП выше, чем количество символов в wholename. Это никогда не бывает так, потому что вы делаете их равными друг другу прямо перед циклом. Есть что-то здесь вы должны изменить, но я не знаю, что, так как я не знаю, какой результат вы хотите :)

1
public static int NumberNames(String t){ 
    if(t == null || t.length() == 0) return 0; 

    return t.trim().split("\\s+").length; 
} 

Разве это намного проще?

EDIT:

Если вы хотите использовать ваш фактический код (только изменил немного):

public class PersonName 
{ 
    public static int NumberNames(String wholename) 
    { 
     // store the name passed in to the method 
     // and replace multiple whitespaces for a single space 
     // and take the "white space" from the beginning and end 
     String testname = wholename.replaceAll("\\s+", " ").trim(); 
     int testnameLength = testname.length(); 
     // initialize number of names found 
     int numnames = 0; 
     // on each iteration remove one name 
     while (testnameLength > 0) 
     { 
      // determine the position of the first blank 
      // .. end of the first word 
      int posBlank = testname.indexOf(' '); 
      // if we reached the last word, break the while-loop 
      if(posBlank == -1) 
      { 
       numnames++; 
       break; 
      } 
      // cut off word 
      testname = testname.substring(posBlank + 1, testnameLength); 
      testnameLength = testname.length(); 
      //System.out.println(numnames); 
      //System.out.println(testname); 
      numnames++;  
     }  
     return numnames; 
    } 

    public static void main(String args[]) 
    { 
     PersonName One= new PersonName(); 

     System.out.println(One.NumberNames("Bobby")); 
     System.out.println(One.NumberNames("Bobby Smith")); 
     System.out.println(One.NumberNames("Bobby L. Smith")); 
     System.out.println(One.NumberNames(" Bobby Paul Smith Jr. ")); 
    } 
} 

Я также сделал два ideones:

0

Петля в то время как должно быть так:

while (testname.length()>numnames) 
+0

Это неверно. Например, у нас есть следующее предложение «Это тест А.». Первая итерация (еще ничего не удалена): '14> 0'; вторая итерация (« Это »удаляется из базы):' 9> 1' , третья итерация («Это» удаляется из базы): '6> 2'; четвертая итерация (« Это тест »удаляется из базы):' 1> 3 == false ', давая ответ 3 и ничего не делая с «А», в то время как это должно быть 4. Я не знаю, почему этот ответ был поддержан, потому что это не имеет никакого смысла. Как цифровые имена каким-либо образом связаны с длина оставшейся строки? .. –

+0

Да, вы правы. – Aywac

0

С изменением, чтобы сделать условие цикла testname.length() > 0 петля никогда не будет прекращена, если не существует пробел в конце названия.

Рассмотрим случай первого вызова, когда строка "Bobby":

int posBlank = testname.indexOf(' '); 

Там нет места, поэтому posBlank является -1.

// cut off word 
testname = testname.substring(posBlank + 1, testname.length()); 

Параметры для вызова подстроки являются -1 + 1 или 0 и 5.

Старая строка "Bobby", новая строка "Bobby", и цикл никогда не будет завершен.

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