2015-12-14 3 views
0

У меня возникли проблемы с обновлением error в нижнем коде. Я включил 2 класса ниже; класс MadLib и класс MadLibRunner.Обновление значения в цикле

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Random; 
import static java.lang.System.*; 
public class MadLib 
{ 
    ArrayList<String> nouns; 
    ArrayList<String> adjectives; 
    ArrayList<String> verbs; 
    public MadLib() 
    { 
     nouns = new ArrayList<String>(); 
     adjectives = new ArrayList<String>(); 
     verbs = new ArrayList<String>(); 
     nouns.add("dog"); 
     nouns.add("pig"); 
     nouns.add("chicken"); 
     nouns.add("building"); 
     nouns.add("car"); 
     nouns.add("person"); 
     nouns.add("place"); 
     nouns.add("thing"); 
     nouns.add("truck"); 
     nouns.add("city"); 
     nouns.add("state"); 
     nouns.add("school"); 
     nouns.add("student"); 
     nouns.add("bird"); 
     nouns.add("turkey"); 
     nouns.add("lion"); 
     nouns.add("tiger"); 
     nouns.add("alligator"); 
     nouns.add("elephant"); 
     adjectives.add("blue"); 
     adjectives.add("green"); 
     adjectives.add("orange"); 
     adjectives.add("fat"); 
     adjectives.add("skinny"); 
     adjectives.add("tall"); 
     adjectives.add("funny"); 
     adjectives.add("mad"); 
     adjectives.add("glad"); 
     adjectives.add("happy"); 
     adjectives.add("silly"); 
     adjectives.add("purple"); 
     adjectives.add("big"); 
     adjectives.add("little"); 
     adjectives.add("tiny"); 
     adjectives.add("huge"); 
     verbs.add("run"); 
     verbs.add("fly"); 
     verbs.add("skip"); 
     verbs.add("climb"); 
     verbs.add("clean"); 
     verbs.add("smell"); 
     verbs.add("eat"); 
     verbs.add("cry"); 
     verbs.add("smile"); 
     verbs.add("laugh"); 
     verbs.add("jump"); 
     verbs.add("crank"); 
     verbs.add("program"); 
    } 
    public String sentence (String statement) 
    { 
     String output = statement; 
     String word = ""; 
     Random rand = new Random(); 
     String error = ""; 
     for (int i = 0; i < output.length() - 1; i++) 
     { 
      if (nouns.size() > 0 && adjectives.size() > 0 && verbs.size() > 0) 
      { 
       if (output.charAt(i) == '#') 
       { 
        int random = rand.nextInt(nouns.size()); 
        word = nouns.get(random); 
        nouns.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
       else if (output.charAt(i) == '&') 
       { 
        int random = rand.nextInt(adjectives.size()); 
        word = adjectives.get(random); 
        adjectives.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
       else if (output.charAt(i) == '@') 
       { 
        int random = rand.nextInt(verbs.size()); 
        word = verbs.get(random); 
        verbs.remove(random); 
        output = output.substring(0, i) + word + (output.substring(i + 1)); 
       } 
      } 
      else 
      { 
       int nounCount = nouns.size() - 1; 
       int adjectiveCount = adjectives.size() - 1; 
       int verbCount = verbs.size() - 1; 
       if (nounCount == 0) 
       { 
        error = error + "Error: Not enough nouns."; 
       } 
       else if (adjectiveCount == 0) 
       { 
        error = error + "Error: Not enough adjectives."; 
       } 
       else if (verbCount == 0) 
       { 
        error = error + "Error: Not enough verbs."; 
       } 
       else if (nounCount == 0 && adjectiveCount == 0) 
       { 
        error = error + "Error: Not enough nouns and adjectives."; 
       } 
       else if (nounCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough nouns and verbs."; 
       } 
       else if (adjectiveCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough adjectives and verbs."; 
       } 
       else if (nounCount == 0 && adjectiveCount == 0 && verbCount == 0) 
       { 
        error = error + "Error: Not enough nouns, adjectives, and verbs."; 
       } 
       output = "Error: Not enough " + error; 
       break; 
      } 
     } 
     return output; 
    } 
} 

А класс бегуна ...

public class MadLibRunner 
{ 
    public static void main(String args[]) 
    { 
     boolean quit=false; 
     MadLib prog = new MadLib(); 
     do 
     { 
      out.println("Welcome to MadLibs!\n Please input your coded sentence, or end to exit: "); 
      Scanner in = new Scanner (System.in); 
      String statement = in.nextLine(); 
      if(statement.equals("end")) 
       quit=true; 
      else 
       out.println(prog.sentence(statement)); 
     }while(!quit); 
     out.println("\nThank you, goodbye.\n"); 
    } 
} 

Цель else заявления в петле, чтобы определить, какие части речи отсутствует. Проблема, которую я продолжаю получать, - error, не будет обновляться в конце цикла for в MadLib. Я попытался изменить начальное значение error, чтобы проверить выход, и он вернул тестовое значение error. Как я могу получить error для обновления в цикле?

Вау, я просто понял, что забыл прояснить что-то очень важное. Я должен иметь возможность вводить несколько предложений в код, и каждый раз, когда используемые существительные/прилагательные/глаголы удаляются из списка. Если в течение любой итерации недостаточно одного из этих частей речи для всего предложения, оно должно отображать сообщение об ошибке. Сообщение об ошибке - это то, что не работает.

+1

Предлагаю вам выполнить свой код в своем отладчике, если вы хотите понять, что делает каждая строка кода. Если переменная 'error' не изменяется, то ни одно из ваших условий не является« истинным » –

+0

, почему он должен ввести этот блок кода? В ваших контейнерах содержатся записи (существительные, глаголы и т. Д.) – Nim

+0

Что он печатает, если вы добавляете 'System.out.println (nounCount +" "+ adjectiveCount +" "+ verbCount),' после этой строки 'int verbCount = глаголы .size() - 1; '? Я уверен, что он печатает '-1'. Таким образом, все ваши 'if-else' являются ложными, так как они никогда не равны 0. – Frakcool

ответ

0

Этот код ОЧЕНЬ многословный и будет подвержен проблемам, если вы когда-нибудь решите, что хотите наречия или что-то в этом роде.

if (nounCount == 0) 
{ 
    error = error + "Error: Not enough nouns."; 
} 
else if (adjectiveCount == 0) 
{ 
    error = error + "Error: Not enough adjectives."; 
} 
else if (verbCount == 0) 
{ 
    error = error + "Error: Not enough verbs."; 
} 
else if (nounCount == 0 && adjectiveCount == 0) 
{ 
    error = error + "Error: Not enough nouns and adjectives."; 
} 
else if (nounCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough nouns and verbs."; 
} 
else if (adjectiveCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough adjectives and verbs."; 
} 
else if (nounCount == 0 && adjectiveCount == 0 && verbCount == 0) 
{ 
    error = error + "Error: Not enough nouns, adjectives, and verbs."; 
} 
output = "Error: Not enough " + error; 
break; 

Я бы реструктурировал вещи так, чтобы у вас были ваши чеки с кодом замены.

String replacement; 

if (output.charAt(i) == '#') 
{ 
    if (nouns.size() > 0) 
    { 
     int random = rand.nextInt(nouns.size()); 
     replacement = nouns.get(random); 
     nouns.remove(random); 
    } else { 
     return "Error: ran out of nouns"; 
    } 
} else if ... 

output = output.substring(0, i) + replacement+ (output.substring(i + 1)); 

Это не идеально, но таким образом вы можете свести к минимуму количество конкретных случаев ошибок, которые у вас есть. Кроме того, вам все равно, нет ли прилагательных, если в предложении нет прилагательных.

В текущей форме ваш код должен работать, как только вы снимаете - 1, так как размер один. Если в списке нет элементов, размер будет 0, поэтому ваш случай будет if (nouns.size() == 0)

0

При создании MadLib вы добавляете существительные, глаголы и прилагательные. Следовательно, код, в котором обновляется error, никогда не выполняется.

Более точно, следующее выражение всегда истинен:

if (nouns.size() > 0 && adjectives.size() > 0 && verbs.size() > 0) 

Следовательно else блок, где error может быть установлен никогда не введен.

+0

Это имело бы смысл, но (надеюсь) я называю класс «MadLib» дважды; один раз для запуска prog и один раз для запуска 'statement'. –

+0

@ EruIlúvatar Не уверен, что я следую. Что вы имеете в виду «дважды называть« MadLib »? Построить его? Если это так, то он будет действовать одинаково в обоих случаях. – dave

+0

Я запускаю 'prog' один раз, а затем вызываю класс' предложение' один раз. Извините, если я не уточнил, что –

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