Поскольку я думаю, что лучший способ ответить на этот вопрос - помочь вам учиться небольшими шагами, я попытался придерживаться вашей первоначальной идеи о том, как решить эту проблему, и отредактировал ваш основной метод с минимальными изменениями.
Это один делает свое дело.
public static void main(String[] args) {
int numOfStrings;
Scanner scan = new Scanner(System.in); // Creating Scanner object
System.out.print("Enter the number of strings: ");
numOfStrings = scan.nextInt();
scan.nextLine(); // you need this to catch the enter after the integer you entered
System.out.print("Enter the strings: ");
StringBuilder paliString = new StringBuilder();
for (int n = 0; n < numOfStrings; n++) {
String userString = scan.nextLine();
if (isPali(userString)) {
if (paliString.length() > 0) {
paliString.append("; ");
}
paliString.append(userString);
}
}
System.out.println("The palindromes are: " + paliString);
}
Ключевые изменения:
- Я добавил
scan.nextLine();
сразу после прочтения количества строк. Это обрабатывает новую строку, которую вы получаете, когда пользователь нажимает Enter. - Вам не нужно инициализировать StringBuilder с помощью numOfStrings. Это просто предварительно распределяет размер StringBuilder в символах. Не количество строк. В любом случае, это не обязательно. StringBuilder растет по мере необходимости.
- Я предлагаю вам проверить, что я делал внутри for-l oop. Это был самый большой беспорядок и значительно изменился.
- Последнее, но не менее важное: запись результата должна быть за пределами for-l oop, после того как все палиндромы были добавлены в StringBuilder.
Редактировать
Исходя из вашего комментария, в этой следующей итерации я изменил использование StringBuilder на использование ArrayList. (Что-то совершенно другое) Я использую это здесь, потому что списки в Java растут по требованию. А поскольку число палиндромов, вероятно, не равно количеству входных строк, это путь к go. Чтобы действительно присвоить его массиву, всегда можно вызвать String[] paliStringsArray = paliStrings.toArray(new String[]{});
, но так как ArrayLists уже используют базовый массив и не нужны для генерации нужного вам вывода, я не поместил его в новую версию.
Пожалуйста, сравните различия этого шага с предыдущей версией. Я также добавил эту String.join("; ", paliStrings)
часть, которая создает желаемый результат.
public static void main(String[] args) {
int numOfStrings;
Scanner scan = new Scanner(System.in); // Creating Scanner object
System.out.print("Enter the number of strings: ");
numOfStrings = scan.nextInt();
scan.nextLine(); // you need this to catch the enter after the integer you entered
System.out.print("Enter the strings: ");
List<String> paliStrings = new ArrayList<>();
for (int n = 0; n < numOfStrings; n++) {
String userString = scan.nextLine();
if (isPali(userString)) {
paliStrings.add(userString);
}
}
System.out.println("The palindromes are: " + String.join("; ", paliStrings));
}
А теперь последний шаг. Арвинд Кумар Авина sh фактически решил часть, которую я также пропустил в первоначальном вопросе. (Я буду читать более внимательно в будущем). Он проверял пользовательский ввод. Поэтому для последней итерации я добавил его код проверки измененным способом. Я положил это в метод, так как думаю, что это проясняет ситуацию и избавляет от необходимости переменной boolean valid
.
public static void main(String[] args) {
int numOfStrings;
Scanner scan = new Scanner(System.in); // Creating Scanner object
System.out.print("Enter the number of strings: ");
numOfStrings = scan.nextInt();
scan.nextLine(); // you need this to catch the enter after the integer you entered
System.out.print("Enter the strings: ");
List<String> paliStrings = new ArrayList<>();
for (int n = 0; n < numOfStrings; n++) {
String userString = readNextLine(scan);
if (isPali(userString)) {
paliStrings.add(userString);
}
}
System.out.println("The palindromes are: " + String.join("; ", paliStrings));
}
static String readNextLine(Scanner scanner) {
while (true) {
String userString = scanner.nextLine();
if (userString.matches("[A-Za-z0-9 ]+")) {
return userString;
} else {
System.out.println("Error: invalid input.");
}
}
}