Как узнать, является ли первый символ строки определенным символом, и если это так, выполнить действие (не работает правильно)
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 проблемы с вашим кодом.
Сравнение
String
с помощью==
Это неправильно, потому что сравнивает ссылку на объект, а не содержимое объекта. Вам нужно использовать
String.equals()
сравнивать. В вашем случае вы даже можете использоватьString.startsWith()
чтобы проверить, начинается ли ваш ввод с чего-то.использование
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();