Как отфильтровать пользовательский ввод, чтобы он принимал символы char и int, но не специальный символ. Затем только принимает значение int в массив

#java #input #user-input

#Ява #вход #пользовательский ввод

Вопрос:

Создайте новую очередь со строковым типом данных, в которую пользователь вводит элементы очереди.

Ограничения:

  1. Пользователь может вводить только буквы и цифры (A-Z, a-z и 0-9).
  2. Программа принимает только числа из входных данных (целое число)
  3. В любом случае, если будет введен хотя бы один специальный символ, программа вернет ошибку. (это включает в себя ПРОСТРАНСТВО)

Это требование к программе. И это то, что у меня есть до сих пор:

 import java.util.Queue; import java.util.Scanner; import java.util.Iterator;  public class Main {  public static void main (String args[]){      Scanner scan = new Scanner(System.in);  System.out.println("This is a Queue program. Please enter how many integer/s will be inputted.");  int count = scan.nextInt();  scan.nextLine();  System.out.println("Enter the valid interger/s:");  String[] list = new String[count];    for (int i = 0; i lt; count; i  ){  list[i] = scan.nextLine();  }  Queuelt;Stringgt; newlist = new LinkedListlt;gt;();      for (String i:list){  newlist.add(i);  }  System.out.println(newlist);    Iteratorlt;Stringgt; i=newlist.iterator();    while(i.hasNext()){    if(i.next().toString().matches("[^0-9] ")){  i.remove();  }  }  System.out.println(newlist);  } }   

Очевидно, что эта программа удаляет только символ без объединения с int. Я пытался использовать replaceAll("[^\d]", " "); его, но я не знаю, как заставить его работать. Пожалуйста, помогите.

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

1. Каков результат вашей программы?

2. Вывод должен быть массивом с нефильтрованными элементами, например [hello123, 456, nice, hi789hey] , и массивом, который затем фильтруется, чтобы принимать только int, например [123, 456, 789] . Кроме того, программа должна отправлять сообщение об ошибке при вводе специального символа.

Ответ №1:

Разрешенные вами символы-это A-Z , a-z , и 0-9 . В регулярном выражении \w соответствует этим символам. И \W соответствует любому, кроме этих персонажей. Поэтому установите последний в качестве разделителя и посмотрите, как это работает.

 Scanner scan = new Scanner(System.in); scan.useDelimiter("\W "); while (true) {  System.out.println(scan.next()); }  

Каждая возвращаемая группа символов scan.next() должна содержать только допустимые символы.

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

1. Хорошо, я попробую это сделать. Но, как только у меня будет разрешенный ввод, как мне удалить буквы, если они вводятся вместе с числом, например 123hello , поскольку программа должна принимать значение int только для окончательного вывода массива.

2. пробел по-прежнему будет разделителем и scan.nextInt() также будет работать. Поэтому я предположил, что, когда вы захотите, int вы будете использовать nextInt() , а когда захотите, вы будете использовать строку next() . В противном случае это может быть вам не полезно.

3. Другой вариант-просто принимать строки в обычном режиме (без установленных разделителей). Затем для каждой строки вы можете использовать match() регулярное выражение, чтобы увидеть, являются ли это просто буквами или просто цифрами, и обрабатывать их по мере необходимости (e.g. for an int, Integer.parseInt() , но это в значительной степени делает то же самое, что я предлагал ранее.

4. Кстати, в вашем приглашении говорится, что это программа очереди. Пожалуйста, введите, сколько целых чисел/с будет введено? . Это что, ошибка? Ваши входные данные должны быть целыми числами.

5. Я попробовал сначала то, что вы предложили, но я не могу заставить это работать, как только я что-то ввожу, программа не останавливается, чтобы принимать больше входов. Что я делаю не так?