Проблема Java со сканером

У меня есть метод, который должен сканировать одну из трех букв заглавными или строчными буквами и возвращать строчную версию письма. Если введена неправильная буква, пользователь предупреждается и повторно запрашивается буква. У меня есть две проблемы: 1: как только метод запускается, я получаю выводную строку с сообщением об ошибке, сообщающим пользователю о недопустимой записи, не дожидаясь записи! (поэтому при втором запуске метода я вижу High, low or sevens (H/L/S):Invalid entry. Please try again using H/L/S! перед вводом чего-либо, затем метод снова вызывается, и все работает нормально, за исключением моей следующей проблемы) 2: запись, полученная от сканера, никогда не проходит ни один из моих операторов if даже хотя должно.

мой код:

private static char getHighLow(Scanner inScanner) {
    System.out.print("High, low or sevens (H/L/S):");
    String entered = inScanner.nextLine();
    System.out.print(entered);
    if(entered.equals("H") || entered.equals("h")){
        return 'h';
    }
    else if (entered.equals("L") || entered.equals("l")){
        return 'l';
    }
    else if(entered.equals("S") || entered.equals("s")){
        return 's';
    }

        char result = 0;
        while(result != 'l' || result != 'h' || result != 's'){
        System.out.println("Invalid entry. Please try again using H/L/S!");
        result=getHighLow(inScanner);
    }
        return result;
}

person Osman    schedule 15.10.2012    source источник


Ответы (5)


Вместо использования while() вы можете использовать else следующим образом:

private static char getHighLow(Scanner inScanner) {
    System.out.print("High, low or sevens (H/L/S):");
    String entered = inScanner.nextLine();
    System.out.print(entered);
    if(entered.equals("H") || entered.equals("h")){
        return 'h';
    }
    else if (entered.equals("L") || entered.equals("l")){
        return 'l';
    }
    else if(entered.equals("S") || entered.equals("s")){
        return 's';
    }
    else {
        System.out.println("Invalid entry. Please try again using H/L/S!");
        return getHighLow(inScanner);
    }   
}
person k2289    schedule 15.10.2012
comment
спасибо, со всеми хорошими ответами, мне очень нравится ваше предложение, так как я не знал, что вы можете это сделать, это очень поможет мне в будущем! - person Osman; 15.10.2012

Вы можете просто использовать equalsIgnoreCase и обрезать введенную строку. И добавьте цикл while, пока ваше условие не будет выполнено.

    Scanner scanner = new Scanner(System.in);
    boolean loop = true;
    String choice = null;
    while (loop) {
        System.out.print("High, low or sevens (H/L/S):");
        choice = scanner.nextLine();
        if ("H".equalsIgnoreCase(choice.trim())
                || "L".equalsIgnoreCase(choice.trim())
                || "S".equalsIgnoreCase(choice.trim())) {
            System.out.println("Correct Choice");
            loop = false;
        }
        else
        {
            System.out.println("Wrong Choice");
        }
    }
    System.out.print(choice);
person Amit Deshpande    schedule 15.10.2012
comment
@user860869 user860869 Проверьте обновленный код, я думаю, он удовлетворяет всем вашим требованиям. - person Amit Deshpande; 15.10.2012
comment
Я обсуждал это, это просто практически переписало все, что я сделал, и мне больше нравится другой ответ, так как я искал не просто решение, а понимание. Я проголосовал за и большое спасибо за помощь! - person Osman; 15.10.2012

Эй, ты вообще не выходишь из цикла while. Ты это видел ?

person sakthisundar    schedule 15.10.2012
comment
как? если result='l' или 's' или 'h' не должны разорвать цикл? - person Osman; 15.10.2012

Это то, что вы хотите. Вот программа для перебора символов в строке. И преобразуйте их в строчные буквы, если они H, L OR S.

package testproj;

import java.util.Scanner;

public class TestProj {

    public static void main(String[] args) {
        Scanner scanner = new Scanner("HLs");
        String result = getHighLow(scanner);
        System.out.println("Result :"+result);
    }

    private static String getHighLow(Scanner inScanner) {
        System.out.println("High, low or sevens (H/L/S):");

        String entered;
        String result = "";
        boolean isCharFound = false;
        String temp = "";
        while (inScanner.hasNext()) {
            temp = inScanner.next();

            System.out.println(temp);

            for (int index = 0; index < temp.length(); index++) {
                entered =new Character(temp.charAt(index)).toString() ;


                if (entered.equals("H") || entered.equals("h")) {
                    result = result + 'h';
                    isCharFound = true;
                } else if (entered.equals("L") || entered.equals("l")) {
                    result = result + 'l';
                    isCharFound = true;
                } else if (entered.equals("S") || entered.equals("s")) {
                    result = result + 's';
                    isCharFound = true;
                }

                if (!isCharFound) {
                    System.out.println("Invalid entry. Please try again using H/L/S!");
                }

                isCharFound = false;
            }


        }

        return result;
    }
}
person Gunjan Shah    schedule 15.10.2012

person    schedule
comment
хорошо, это работает, можете ли вы объяснить мне, в чем разница? - person Osman; 15.10.2012
comment
Ничего особенного, просто зациклили и добавили перерыв. - person Subhrajyoti Majumder; 15.10.2012