Как узнать, является ли первый символ строки определенным символом, и если это так, выполнить действие (не работает правильно)

import java.util.Random;
import java.util.Scanner;

public class MineSweeper {

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    boolean playAgain = true;

    System.out.println("Welcome to Mine Sweeper!");

while (playAgain)   {
    final int MIN_SIZE = 3;
    final int MAX_SIZE = 20;
    final char NO_NEARBY_MINE = ' ';

    String errorWidth = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";
    String errorHeight = "Expected a number from " + MIN_SIZE + " to " + MAX_SIZE + "\nWhat height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):";

    System.out.println("What width of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
    int userWidth = promptUser(scnr, errorWidth, MIN_SIZE, MAX_SIZE);
    System.out.println("What height of map would you like (" + MIN_SIZE + "-" + MAX_SIZE + "):");
    int userHeight = promptUser(scnr, errorHeight, MIN_SIZE, MAX_SIZE);

    String errorGetRow = "Expected a number from " + 1 + " to " + userWidth + ".";
    String errorGetCol = "Expected a number from " + 1 + " to " + userHeight + ".";
    int minRowCol = 1;

    char[][] mineArray = new char[userHeight][userWidth];
    eraseMap(mineArray);
    simplePrintMap(mineArray);

    System.out.println("row: ");
    int row = promptUser(scnr, errorGetRow, minRowCol, userWidth);
    System.out.println("column: ");
    int column = promptUser(scnr, errorGetCol, minRowCol, userHeight);
    mineArray[row-1][column-1] = NO_NEARBY_MINE;
    simplePrintMap(mineArray);

    System.out.println("Would you like to play again (y/n)?");
    String response = scnr.next();
    if (response.startsWith("Y") || response.startsWith("y")) {
            playAgain = true;
    }
    else {
        playAgain = false;
    }

    }
System.out.println("Thank you for playing Mine Sweeper!");
}

public static int promptUser(Scanner in, String prompt, int min, int max) {
    int userTempVal = 0;

        do {
        userTempVal = in.nextInt();
            if (userTempVal < min || userTempVal > max) {
            System.out.println(prompt);
            }

       }while (userTempVal < min || userTempVal > max);

    return userTempVal; 
    }

public static void eraseMap(char[][] map) {
    final char UNSWEPT = '.';
    for (int row = 0; row < map.length; row++) {
        for (int col = 0; col < map[row].length; col++) {
            map[row][col] = UNSWEPT;
        }
    }
    return;
}    

public static void simplePrintMap(char[][] map) {
    for (int row = 0; row < map.length; row++) {
        for (int col = 0; col < map[row].length; col++) {
            System.out.print(map[row][col] + " ");
        }
        System.out.println("");
    }
    return; //FIXME
}

РЕДАКТИРОВАТЬ: Таким образом, я изменил свой код, чтобы использовать.equals, а не ==, и мой код успешно работает, когда я ввожу строку только с одним словом, поэтому "Да". Если я ввожу строку из нескольких слов ("Да, я делаю"), я все равно получаю ошибку. Ввод строки с несколькими словами приводит к ошибке. Когда я использую scnr . next() всегда компилирует оператор else, даже если оператор "Да, я делаю", где первая буква - Y. Если я использую scnr . nextLine() компилирует оператор if, перезапускает цикл, печатает "какую ширину карты...", а затем выдает ошибку, прежде чем я могу что-либо ввести.

Я имею в виду главным образом основной метод внизу от "Хотели бы вы сыграть снова" до конца основного метода. У меня также есть проблема в моем методе promptUser, где я хочу, чтобы метод отображал сообщение об ошибке и снова сканировал int, если пользователь вводит что-то кроме int.

3 ответа

Использование response.equals() вместо ==,

== сравнивает ссылки на объекты, в то время как equals() сравнил бы значения строки.

Вы столкнулись с этой проблемой, потому что вы используете == Оператор для сравнения строк. Если вы использовали утверждение response.substring(0, 1).equals("Y"), это решило бы проблему, так как это реальный способ проверить равенство строк. Или вы можете использовать менее подробный метод, указанный ниже.

public class main{
    public static void main(String[] args){
        String response = "Yello";
        char c = response.charAt(0);
        if(c == 'Y'){
            System.out.println("Do something");
        }
        else if(c == 'y'){
            System.out.println("Do another thing");
        }
    }
}

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

Есть 2 проблемы с вашим кодом.

  1. Сравнение String с помощью ==

    Это неправильно, потому что сравнивает ссылку на объект, а не содержимое объекта. Вам нужно использовать String.equals() сравнивать. В вашем случае вы даже можете использовать String.startsWith() чтобы проверить, начинается ли ваш ввод с чего-то.

  2. использование String.substring() на ваш вклад

    Поскольку пользователь может ввести пустую строку, просто нажмите [ENTER], вы не можете использовать String.substring(0,1) или иначе вы получите String index out of range,

Чтобы исправить вышеуказанные 2 проблемы, вы можете изменить свой код, как показано ниже.

// Read the whole line
String response = scnr.nextLine(); 
// change to upper case first and check the starting character
playAgain = (response.toUpperCase().startsWith("Y")); 

Чтобы убедиться, что следующее чтение готово, я бы предложил добавить Scanner.nextLine() после прочтения текущей строки.

например

userTempVal = in.nextInt();
// add this line to consume the rest of the line
in.nextLine();
Другие вопросы по тегам