2015-05-11 2 views
2
public String compWord() throws IOException, ClassNotFoundException 
{ 
    // Local constants 
    final int MAX_COUNT = 8; 

    // Local variables 
    BufferedReader reader = new BufferedReader(new FileReader("dictionary.txt"));  // Create a new BufferedReader, looking for dictionary.txt 
    List<String> lines = new ArrayList<String>();          // New ArrayList to keep track of the lines 
    String line;                  // Current line 
    Random rand = new Random();               // New random object 
    String word;                  // The computer's word 

    /********************* Start compWord *********************/ 

    // Start reading the txt file 
    line = reader.readLine(); 

    // WHILE the line isn't null 
    while(line != null) 
    { 
     // Add the line to lines list 
     lines.add(line); 

     // Go to the next line 
     line = reader.readLine(); 
    } 

    // Set the computers word to a random word in the list 
    word = lines.get(rand.nextInt(lines.size())); 

    if(word.length() > MAX_COUNT) 
     compWord(); 

    // Return the computer's word 
    return word; 
} 

Насколько я понимаю, это должно быть только возвращающее слова менее 8 символов? Любая идея, что я делаю неправильно? Оператор if должен помнить compWord, пока слово не будет меньше 8 символов. Но почему-то я все еще получаю слова от 10-15 символов.Почему мои слова не выходят менее 8 символов?

ответ

4

Посмотрите на этот код:

if(word.length() > MAX_COUNT) 
    compWord(); 

return word; 

Если слово, которое выбрали больше, чем ваш предел, вы вызываете compWord рекурсивно - но игнорирует возвращаемое значение, и только возвращение «слишком длинное» слово так или иначе.

Лично я хотел бы предложить вам избежать рекурсии, и вместо того, чтобы просто использовать do/while цикл:

String word; 
do 
{ 
    word = lines.get(rand.nextInt(lines.size()); 
} while (word.length() > MAX_COUNT); 
return word; 

В качестве альтернативы, фильтр ранее в то время как вы читаете строки:

while(line != null) { 
    if (line.length <= MAX_COUNT) { 
     lines.add(line); 
    } 
    line = reader.readLine(); 
} 
return lines.get(rand.nextInt(lines.size())); 

Таким образом, вы только выбираете из допустимых строк.

Обратите внимание, что использование Files.readAllLines является довольно простым способом читать все строки из текстового файла, кстати - и в настоящее время вы не закрывать файл после ...

+0

Но не следует ли начинать снова, прежде чем он даже что-нибудь вернет? – trevordavies095

+1

@ tdrunner95: Да, он начинается снова, выбирает случайное слово, возможно, снова рекурсивно, а затем возвращает слово. Затем вы игнорируете это возвращаемое значение и возвращаете все, что было выбрано первым. Я думаю, вам нужно немного почитать о рекурсии ... –

+0

Спасибо. Мой профессор едва коснулся рекурсии. Я посмотрю на это больше. – trevordavies095

0

Если слово длиннее 8 символов, вы просто вызываете свой метод снова, продолжаете и ничего не меняете.

Итак:

  • Вы получаете все слова из файла,

  • Тогда получить случайное слово из списка, и положить его в word строки,

  • И если слово длиннее 8 символов, метод снова запускается.

  • Но, в конце концов, это будет всегда вернуть слово она выбрала первое. Проблема в том, что вы просто вызываете метод рекурсивно, и вы ничего не делаете с возвращаемым значением. Вы вызываете метод, и он что-то сделает, и метод вызывающего абонента будет продолжен, и в этом случае верните word. Не имеет значения, является ли этот метод рекурсивным или нет.

Вместо этого, я бы порекомендовал вам использовать нерекурсивное решение, в соответствии с рекомендациями по тарелочкам, или узнать немного о рекурсии и как использовать его.