Я написал небольшую программу, которая вводит строку и преобразует ее в строку и столбец.Он будет постоянно спрашивать, вводит ли пользователь недопустимую строку.
Пример выполнения:
Provide a coordinate:
hello?
That is not a valid coordinate! Try again.
X4
That is not a valid coordinate! Try again.
C4
Coordinate{col=3, row=4}
Я создал вспомогательный класс для хранения координат.
Обратите внимание, как все читает /записи выполняются в одной функции (readCoordinate
), а все манипуляции со строками - в другой (parseCoordinate
).
Вы также можете выдать исключение, если строка пользователя недействительна, для простоты я вернул null.
package com.company;
import java.util.Scanner;
class Coordinate {
private final int col, row;
public Coordinate(int col, int row) {
this.col = col;
this.row = row;
}
@Override
public String toString() {
return "Coordinate{" +
"col=" + col +
", row=" + row +
'}';
}
}
public class Main {
private final Scanner input;
public static void main(String[] args) {
Main m = new Main();
System.out.println(m.readCoordinate());
}
Main() {
input = new Scanner(System.in);
}
private Coordinate readCoordinate() {
System.out.println("Provide a coordinate:");
while (true) {
String line = input.nextLine();
Coordinate c = parseCoordinate(line);
if (c != null)
return c;
System.out.println("That is not a valid coordinate! Try again.");
}
}
/**
* Converts a string like A2 into a Coordinate object. Returns null if string is invalid.
*/
public Coordinate parseCoordinate(String line) {
line = line.trim().toLowerCase();
if (line.length() != 2)
return null;
char letter = line.charAt(0);
if (letter > 'h' || letter < 'a')
return null;
int col = letter - 'a' + 1;
char number = line.charAt(1);
if (number > '8' || number < '1')
return null;
int row = number - '1' + 1;
return new Coordinate(col, row);
}
}
Ответ на вопросы:
Что такое @Переопределить?
Это дополнительный декоратор, отмечающий, что я переопределяю метод, а не создаю новый.Если я ошибся toString
, как tostring
, моя IDE предупредит меня, что я не переопределил что-то.Вы можете проигнорировать это.
Почему столбец и строка в конце?Разве это не означает, что вы не можете изменить их позже?
Это означает, что вы не можете назначить их после первого присваивания (в конструкторе).Хорошей практикой является создание неизменяемых (неизменяемых == нельзя изменить) классов данных.Например, вы уверены, что если вы передадите Coordinate
методу, метод не сможет изменить ваш экземпляр, и вы не получите испорченного Coordinate
.
Что такое трим?
Обрезать удалить пробелы (пробел, табуляция, ...) с обоих концов строки." hello world! ".trim()
- это "hello world!"
.
Что это за функция Main () со сканером (System.in) после метода main?
Я создал сканер один раз и использовал его много раз,Вы создали новый сканер каждый раз, когда хотите прочитать строку.Я не думаю, что это имеет значение для сканера, но в некоторых случаях вы можете потерять вещи, воссоздав объект.
В readCoordinate, что является истинным во время подготовки?
while (true)
означает цикл навсегда.Есть оператор return, который разрывает бесконечный цикл.
В parseCoordinate, когда вы определяете col, как вы добавляете символ в int?
Символы представляются с помощью чисел, поэтому символы являются числамипод капотом.В Java char
похоже на 16-разрядное целое число без знака, вы можете выполнять обычные целочисленные вычисления на них.
почему readCoordinate типа Coordinate и почему он частный?
Невозиться с модификаторами доступа, пока вы не станете лучше с программированием.Это не имеет большого смысла в небольших программах.Вы можете указать, какие методы следует вызывать извне, а какие - нет.