Loop Keyword Program Домашнее задание - PullRequest
0 голосов
/ 31 марта 2012

Он попросит пользователя ввести ключевое слово для поиска. Затем он попросит пользователя вводить предложения снова и снова. Пользователь может остановить процесс, напечатав «стоп» вместо предложения (что, конечно, означает, что мы не можем проанализировать одно слово «стоп», но это нормально). Когда пользователь закончит ввод предложений, программа должна отобразить следующую статистику:

  1. Общее количество введенных предложений
  2. Общее количество предложений, содержащих ключевое слово
  3. Средняя начальная позиция ключевого слова в предложениях, содержащих ключевое слово.

Может кто-нибудь помочь мне собрать эту программу? Для # 3 мы делаем только среднюю позицию предложений, которые содержат ключевое слово.

У меня есть часть цикла, и для # 3 я предполагаю, что мы будем использовать indexOf. # 2 inputString.contains (ключевое слово) Я предполагаю? Может кто-нибудь помочь мне с 1-3 и положить их в программу Java? Спасибо.

import java.util.Scanner;

public class Lab6Loops {

    public static void main(String[] args)  {

        String keywordString;
        String inputString;
        Scanner keyboard = new Scanner (System.in);
        int numofSentences = 0;
        int numofKeyword = 0;                       
        System.out.println ("Enter a keyword. We will search each sentence for this word.");
        keywordString = keyboard.nextLine ();
        System.out.println ("Please enter a sentence or type 'stop' to finish");
        inputString = keyboard.nextLine ();
        while( !inputString.equals ("stop"))
        {       
            if(inputString.contains (inputString));
            numofSentences = numofSentences + 1;
            if(inputString.contains (keywordString));
            numofKeyword = numofKeyword + 1;
            System.out.println ("Enter a line of text or 'stop' to finish");
            inputString = keyboard.nextLine();
        }
        System.out.println ("You entered " + numofSentences + " sentences");
        System.out.println ("You have " + numofKeyword + "sentences that contain the keyword");
    }   
}

Ответы [ 3 ]

1 голос
/ 31 марта 2012

Мне нравится иметь самодокументируемый код, поэтому вот пара советов о том, как у вас может быть хороший плотный основной цикл:

семантика функционального вывода

public void loop() {
  // TODO: ask for the keyword and store it somewhere

  while(true) {
    try {
      updateStatistics(checkOutput(getSentence()));
    } catch (EndOfInput) {
      printStatistics();
    }
  }
}

Объектно-ориентированный

public void loop() {
  String keyword = myPrompter.getNextSentence();
  myAnalyzer.setKeyword(keyword);

  while (true) {
    String sentence = myPrompter.getNextSentence();
    AnalysisResult result = myAnalyzer.analyze(sentence);
    if (result.isEndOfInput()) {
      myAnalyzer.printStatistics();
      return;
    }
  }
}

То, что оба эти подхода дают вам, представляет собой простую структуру для подключения конкретной логики.Вы можете сделать все это в основном цикле, но это может сбить с толку.Вместо этого желательно, чтобы одна функция выполняла одну задачу.Одна функция запускает цикл, другая получает входные данные, другая подсчитывает количество предложений и т. Д.

Иногда я начинаю с этих маленьких функций и собираю приложение снизу вверх, поэтомунаписать метод, который принимает строку и возвращает true / false в зависимости от того, является ли она строкой «stop».Вы даже можете написать модульные тесты для этого метода, чтобы при создании остальной части приложения вы знали, что этот метод выполняет то, для чего он предназначен.Приятно иметь много модульных компонентов, которые вы можете протестировать по пути, вместо того, чтобы писать огромный длинный цикл и удивляться, почему он не выполняет то, что вы хотите.

0 голосов
/ 01 апреля 2012
package console;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Console {

    static float averagePositionInSentence = 0;
    static String searchTerm = "";
    static int noOfSentencesEntered = 0;
    static int noOfMatches = 0;

    public static void main(String[] args) {
        searchTerm = writeToConsoleAndReturnInput("Add phrase to search for.");
        writeToConsole("Now type some sentences. To exit type the word 'stop' on its own");
        mainInputLoop();
        outputResults();
    }

    public static void mainInputLoop() {

        boolean ended = false;
        while (!ended) {
            try {
                String input = readLineFromConsole();
                if (!input.equalsIgnoreCase("stop")) {
                    maintainStatisticalData(input);
                } else {
                    ended = true;
                }
            } catch (Exception e) {
                writeToConsole("There was an error with your last input");
            }
        }
    }

    public static void outputResults() {
        writeToConsole("You entered " + noOfSentencesEntered + " sentences of which " + noOfMatches + " conatined the search term '" + searchTerm + "'");
        writeToConsole("");
        writeToConsole("On average the search term was found at starting position " + (averagePositionInSentence / noOfSentencesEntered) + " in the sentence");
    }

    public static void maintainStatisticalData(String input) {
        noOfSentencesEntered++;
        if (input.contains(searchTerm)) {
            noOfMatches++;
            int position = input.indexOf(searchTerm)+1;
            averagePositionInSentence += position;
        }
    }

    //terminal helper methods
    public static void writeToConsole(String message) {
        System.out.println(message);
    }

    public static String writeToConsoleAndReturnInput(String message) {
        System.out.println(message);
        try {
            return readLineFromConsole();
        } catch (IOException e) {
            //should do something here
            return "Exception while reading line";
        }
    }

    public static String readLineFromConsole() throws IOException {
        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(converter);

        return in.readLine();
    }
}
0 голосов
/ 31 марта 2012

звучит так, как будто вам нужно запросить у пользователя начальный ввод, а затем войти в цикл, который будет длиться до тех пор, пока пользователь не нажмет остановку (или что-то еще), в каждой итерации вам нужно запрашивать у пользователя предложение, если пользовательвходные данные увеличивают один счетчик, в котором хранится количество предложений, проверяют предложение по введенному ключевому слову и, если применимо, увеличивают второй счетчик, вам также нужно будет сдвинуть позицию, в которой произошло слово, в стек, чтобы позже получить среднее значение, которое должнобыть суммой стека, деленной на размер.Вы должны быть в состоянии использовать indexOf(), чтобы получить позицию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...