Как проверить, является ли элемент изменяемого списка или ввод строки числом?

#string #function #kotlin #mutablelist

Вопрос:

Я столкнулся с проблемой в приведенном ниже коде.

 fun main() { val table = mutableListOf(  mutableListOf(' ', ' ', ' '),  mutableListOf(' ', ' ', ' '),  mutableListOf(' ', ' ', ' ') )  println("---------") println("| "   table[0][0]   " "   table[0][1]   " "   table[0][2]   " |") println("| "   table[1][0]   " "   table[1][1]   " "   table[1][2]   " |") println("| "   table[2][0]   " "   table[2][1]   " "   table[2][2]   " |") println("---------")  print("Enter the coordinates: ") var coordinates = readLine()!!.split(" ").toMutableList() var x = coordinates[0].toInt() var y = coordinates[1].toInt()   while (x gt; 3 || x lt; 1 || y gt; 3 || y lt; 1) {  println("Coordinates should be from 1 to 3!")  print("Enter the coordinates: ")  coordinates = readLine()!!.split(" ").toMutableList()  x = coordinates[0].toInt()  y = coordinates[1].toInt() }  while (table[x-1][y-1] == 'X' || table[x-1][y-1] == 'O') {  println("This cell is occupied! Choose another one!")  print("Enter the coordinates: ")  coordinates = readLine()!!.split(" ").toMutableList()  x = coordinates[0].toInt()  y = coordinates[1].toInt() }  table[x-1][y-1] = 'X'  println("---------") println("| "   table[0][0]   " "   table[0][1]   " "   table[0][2]   " |") println("| "   table[1][0]   " "   table[1][1]   " "   table[1][2]   " |") println("| "   table[2][0]   " "   table[2][1]   " "   table[2][2]   " |") println("---------")   if (table[0][0] == 'X' amp;amp; table[0][1] == 'X' amp;amp; table[0][2] == 'X' ||  table[1][0] == 'X' amp;amp; table[1][1] == 'X' amp;amp; table[1][2] == 'X' ||  table[2][0] == 'X' amp;amp; table[2][1] == 'X' amp;amp; table[2][2] == 'X' ||  table[0][0] == 'X' amp;amp; table[1][0] == 'X' amp;amp; table[2][0] == 'X' ||  table[0][1] == 'X' amp;amp; table[1][1] == 'X' amp;amp; table[2][1] == 'X' ||  table[0][2] == 'X' amp;amp; table[1][2] == 'X' amp;amp; table[2][2] == 'X' ||  table[0][0] == 'X' amp;amp; table[1][1] == 'X' amp;amp; table[2][2] == 'X' ||  table[2][0] == 'X' amp;amp; table[1][1] == 'X' amp;amp; table[0][2] == 'X' ) {  println("X wins") } else if (table[0][0] == 'O' amp;amp; table[0][1] == 'O' amp;amp; table[0][2] == 'O' ||  table[1][0] == 'O' amp;amp; table[1][1] == 'O' amp;amp; table[1][2] == 'O' ||  table[2][0] == 'O' amp;amp; table[2][1] == 'O' amp;amp; table[2][2] == 'O' ||  table[0][0] == 'O' amp;amp; table[1][0] == 'O' amp;amp; table[2][0] == 'O' ||  table[0][1] == 'O' amp;amp; table[1][1] == 'O' amp;amp; table[2][1] == 'O' ||  table[0][2] == 'O' amp;amp; table[1][2] == 'O' amp;amp; table[2][2] == 'O' ||  table[0][0] == 'O' amp;amp; table[1][1] == 'O' amp;amp; table[2][2] == 'O' ||  table[2][0] == 'O' amp;amp; table[1][1] == 'O' amp;amp; table[0][2] == 'O' ) {  println("O wins") }  

}

Я могу проверить, что ввод не меньше или не больше 3 (координаты), а также могу проверить, что поле не занято. Но как я могу проверить, что ввод не является строкой с циклом while, таким как проверка занятости поля и координат. Заранее спасибо!

Комментарии:

1. Таблица-это символ[][] — верно? char* pC = amp;Table[0][0]; for(int i = 0; ilt;9; i ){if(*pC = /*check for the ascii code - here you can define a range*/)throw new std::exception();}else{pC ;} Что-то вроде Извините, я немного не в родном коде C, но должно выглядеть примерно так. Вы можете сделать это по — другому, но, пожалуйста, используйте циклы foreach, если вы думаете в матрицах,-не делайте этого, пока.

2. Извините, я не упомянул, что код находится в Котлине. Я понимаю кое-что из вашего кода, но он написан на языке C. Я вижу, что цикл yor for повторяет элементы таблицы. Но что мне нужно, так это проверить, является ли ввод строкой или числом, если это не число, то ему нужно запросить допустимый ввод числа, а затем обновить таблицу с помощью X или O. Эта часть кода сейчас не написана.

3. Похоже, что для этого действительно могли бы пригодиться некоторые советы по написанию лучшего кода, вы могли бы попробовать опубликовать это (с ответом ниже) в codereview.stackexchange.com, потому что это немного чересчур, чтобы указывать здесь в комментариях. Но,по крайней мере,я бы посоветовал дать полям 3 состояния с перечислением { X, 0, ПУСТО } вместо работы с необработанными строками и не используйте изменяемые списки, если в этом нет необходимости, поэтому не используйте split()

4. Ладно, я совершил ошибку, но люди могут ошибаться. Я не совершенен в английском, потому что это не мой родной язык. Но, честно говоря, вы видите разницу между C и Котлином! Я ценю ваш совет! Но мне нужно решить проблему таким образом. Я думаю, что никто не глуп, чтобы использовать строковый ввод, если известно, что он использует цифру. Но не я пишу это задание. Я должен решить ее письменно. Проверьте, не является ли ввод строкой, проверьте, находится ли она вне диапазона, и проверьте, занято ли поле.

Ответ №1:

Я бы предложил сделать это так

 x = coordinates[0].toIntOrNull() ?: 99 y = coordinates[1].toIntOrNull() ?: 99  

разница с toInt() и toIntOrNull() заключается в том, что toIntOrNull() не создает исключения, когда оно не может превратить его в Int, а вместо этого возвращает null. Это может быть перенаправлено на запасной номер с помощью оператора elvis ?: . Здесь вы можете разместить все, что не входит в ваш необходимый диапазон 1-3. Я просто выбрал 99, чтобы продемонстрировать это.

Комментарии:

1. Это действительно самое простое решение «подключи и играй», но рефакторинг, чтобы null напрямую повторял попытки вместо использования магического числа для этого, был бы чище

2. @что-то, что-то правда. и я согласен с вашим комментарием по вопросу о том, что есть возможности для гораздо большего улучшения. Но я подумал, что это выйдет за рамки данного вопроса. Я обычно воздерживаюсь от предложений ответов, требующих серьезного рефакторинга, и поэтому дал решение, которое выполняло бы эту работу с минимальными изменениями, насколько это возможно

Ответ №2:

Я сделал это таким образом:

 print("Enter the coordinates: ") var coordinates = readLine()!!.split(" ").toMutableList()   while (coordinates[0].length gt; 1 || coordinates[1].length gt; 1 || coordinates[0].length gt; 1 amp;amp; coordinates[1].length gt; 1 ) {  println("You should enter numbers!")  print("Enter the coordinates: ")  coordinates = readLine()!!.split(" ").toMutableList() }  

Комментарии:

1. Почему вы предпочитаете этот подход предыдущему ответу @Ivoks?

2. Просто хочу найти другое решение.

3. Не похоже, что это сработает для отдельных букв