.hasNext () и .next () вызывают бесконечный цикл while - PullRequest
0 голосов
/ 05 мая 2018

Я в классе кодирования для начинающих, и это мое задание: Напишите пустой метод palindromeCheck, который не имеет аргументов. Метод должен обладать функциональностью, чтобы проверять, является ли слово (а) палиндромом, и выводить на экран все палиндромы, по одному на строку. Кроме того, в последней строке выходных данных должно быть сообщение: «Имеется x палиндромов из y слов, предоставленных пользователем» (где x - количество обнаруженных слов палиндрома, а y - общее количество слов, введенных пользователем). Подсказка: для этого лабораторного упражнения вам понадобятся следующие методы для объектов String: length () задает длину строки (то есть количество символов в ней) и charAt (i) - дает символ в позиции i. Так как вводимый ввод должен быть отделен пробелом, я не понимаю, как создать цикл while, который повторяется для каждого введенного слова. Мой профессор оказал нам помощь в виде скелета для метода, который она хочет, чтобы мы создали. В этом скелете есть цикл while, который выполняет действия для каждого введенного слова

while (keyboard.hasNext()){
someWord = keyboard.next();
// some code that performs actions
}

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

public static void palindromeCheck(){
    String someWord = ""; // Stores words read from user input
    int count = 0;        // keeps track of Palindrome words only
    int total = 0; // Counts the total number of lines read from the given text file
    int score = 0; // used as a condition to count palindrome words   
    System.out.println("Enter some words separated by white space."); 
    Scanner keyboard = new Scanner(System.in);

    while (keyboard.hasNext()) { // for each word user enters
        someWord = keyboard.next(); // store each word in a string variable and then do operations
        score = 0;
        int n = (someWord.length()-1);
        for (int i = 0; i < (someWord.length()-2); i++){
            for (int j = (someWord.length()-1); i < (someWord.length()-2); j--){
                j = n;
                n--;
                if(someWord.charAt(i) == someWord.charAt(j)){
                    break;
                }
                else
                    score++;
            }
        }
        if(score == 0){ // if word is palindrome adds to counter
            count++;
        }
        total++; // increment number of words as you read each one
        //System.out.println("  " + total + " " + someWord);   // test
    }
    System.out.println("There are " + count + " palindromes out of " + total + " words provided by user.");
}

Ответы [ 4 ]

0 голосов
/ 05 мая 2018

Я еще не узнал о string.split, поэтому я хочу избегать его использования. Посмотрев на эти ответы немного, я придумал обходной путь для любого, кто посмотрит на это в будущем, что может оказаться полезным. И я исправил проблему сбоя моей программы с помощью некоторых слов, таких как boop. Я исправил свою программу, добавив две вещи ...

Это

System.out.println("Enter some words separated by white space. Type exit at anytime to receive results."); 

и

someWord = keyboard.next().toLowerCase(); // store each word in a string variable and then do operations
        if(someWord.equals("exit")){
            break;
        }

и исправил падение некоторых слов, добавив оператор break к else в этом операторе if / else

if(someWord.charAt(i) == someWord.charAt(j)){
    break;
 }
 else{
    score++;
    break;
 }

Вот мой обновленный и окончательный код ниже.

 public class Lab5
{
    public static void main (String [] args){
        palindromeCheck();
    }

public static void palindromeCheck(){
        String someWord = ""; // Stores words read from user input
        int count = 0;        // keeps track of Palindrome words only
        int total = 0; // Counts the total number of lines read from the given text file
        int score = 0; // used as a condition to count palindrome words
        String exit = "exit";

        System.out.println("Enter some words separated by white space. Type exit at anytime to receive results."); 
        Scanner keyboard = new Scanner(System.in);

        while (keyboard.hasNext()) { // for each word user enters
            someWord = keyboard.next().toLowerCase(); // store each word in a string variable and then do operations
            if(someWord.equals("exit")){
                break;
            }
            score = 0;
            int n = (someWord.length()-1);
            for (int i = 0; i < (someWord.length()-2); i++){
                for (int j = (someWord.length()-1); i < (someWord.length()-2); j--){
                    j = n;
                    n--;
                    if(someWord.charAt(i) == someWord.charAt(j)){
                        break;
                    }
                    else{
                        score++;
                        break;
                    }
                }
            }
            if(score == 0){ // if word is palindrome adds to counter
                count++;
            }
            total++; // increment number of words as you read each one
        }
        System.out.println("There are " + count + " palindromes out of " + total + " words provided by user.");
    }
}
0 голосов
/ 05 мая 2018

Введите Ctrl / z (Ctrl / d в Windows - или наоборот?). Все будет хорошо.

0 голосов
/ 05 мая 2018

Кажется, что ваш цикл неправильный, с тем, что у вас есть, вы берете новые данные в каждом цикле, и это продолжается до бесконечности. (т. е. пользователь вводит что-то, нажимает ввод, цикл запускается снова; промыть и повторить). Я предполагаю, что это не то, к чему ты стремился, так что ...

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

Кстати, опубликованный код вылетает с определенными словами.

Пожалуйста, смотрите обновленную версию здесь ...: -)

    public static void palindromeCheck(){

        String someWord = ""; // Stores words read from user input
        int count = 0;        // keeps track of Palindrome words only
        int total = 0; // Counts each word/String read from the array
        System.out.println("Enter some words separated by white space."); 
        Scanner keyboard = new Scanner(System.in);

        //Get input from user
        String userInput = keyboard.nextLine();

        int nextWord = 0;
        String[] userInputArray = userInput.split("\\s+"); //Split into separate words (returns an array)

        while (nextWord<userInputArray.length) { //for each word in array        

            someWord = userInputArray[nextWord++]; // store each word in a string variable and then do operations, increments nextWord 

            int lastChar = (someWord.length()-1);
            int firstChar = 0;
            int loops = (someWord.length())/2;
            for(int i = 0;i<loops;i++){
                //If characters don't match, break out of loop, otherwise carry on
                if(someWord.charAt(firstChar++)!=someWord.charAt(lastChar--)) //move to next/previous characters once checked
                   break;
                //if we've checked the whole word, then we've found a palindrome
                if(i>=loops-1){
                    count++; 
                }
            }
            total++; // increment number of words as you read each one
        }
        System.out.println("There are " + count + " palindromes out of " + total + " words provided by user.");
    }
}
0 голосов
/ 05 мая 2018

Вы не можете рассчитывать, что keyboard.hasNext() сообщит вам, когда ваша программа должна остановиться. Клавиатура, по сути, является бесконечным источником ввода, поэтому keyboard.hasNext() может никогда возвращать false. Если есть данные из предыдущей строки ввода, которые еще не были обработаны, они немедленно вернут true. Но если все данные из предыдущей строки были израсходованы, keyboard.hasNext() просто будет сидеть и ждать, пока вы наберете другую строку, а затем вернет true, как только вы нажмете ENTER.

Поскольку вы не можете рассчитывать, что keyboard.hasNext() скажет вам, что пришло время прекратить обработку слов, вам нужно запрограммировать другой способ решить, когда программа должна остановиться.

Самый хороший способ, с точки зрения вашего пользователя, это прочитать одну целую строку ввода, обработать все слова в этой строке и затем остановиться. Вы используете keyboard.nextLine(), чтобы прочитать всю строку ввода:

String inputLine = keyboard.nextLine();

После этого у вас есть множество вариантов, как разбить эту строку на отдельные слова. Вот примеры двух способов.

Используйте Scanner(String):

String inputLine = keyboard.nextLine();
Scanner wordScn = new Scanner(inputLine);
while (wordScn.hasNext())
{
    String someWord = wordScn.next();
    // ... process someWord
}

Использование String.split(String delimRegEx):

String inputLine = keyboard.nextLine();
String[] words = inputLine.split("\\s+");
for (String someWord : words)
{
    // ... process someWord
}

Аргумент "\\s+" для split - это регулярное выражение , которое задает разделитель между словами, что означает «пробел (\s), один или несколько из (+)» .

...