Как решить задачу, используя цикл for? Как установить в цикле количество повторений?

Пользователь вводит строку с помощью Scanner. Ввод происходит одной строкой, к примеру: "Привет" + 5.

Задача: вывести в консоль слово "Привет" столько раз подряд, зависит от числа, которое стоит после знака плюс.

К примеру, ввели: "Привет" + 3

Вывод: "ПриветПриветПривет"

Предполагаю что надо создать массив arrString[] и с помощью метода .Split("+") разделить строку на массив получится массив ["Привет", 3] и с помощью цикла for вывести первый элемент массива 3 раза.

Scanner scanner = new Scanner(System.in);
System.out.println("Введите строку: ");
String str = scanner.nextLine;
System.out.println(inputStr(str));

String [] arrString;

public static String inputStr(String str1){
   StringBuilder sb = new StringBuilder();
   for (int i=0; i<str1.lenght; i++){
         ArrString.sb.toString().Split("+"); 

   }
  for (i=0; i<arrString[1]; i++){
     sb.append(arrString[0]);
  }
}

С помощью "+" делю строку на массив с двумя элементами. Второй элемент массива число.

ВОПРОС: как мне поставить второй элемент массива в цикл for, чтобы повторить первый элемент массива, то количество раз которое указано во втором элементе массива?*/


Ответы (1 шт):

Автор решения: Nowhere Man

Код, представленный в вопросе, совершенно НЕ рабочий -- он не компилируется НЕ только из-за сравнения числа со строкой i<arrString[1], но содержит массу других ошибок:

  • начальные строки написаны вне метода main,
  • массив arrString объявлен непонятно где -- скорее всего, между двумя методами
  • потеряны скобки при вызове метода scanner.nextLine()
  • в методе inputStr первый цикл лишен всякого смысла, его следовало бы просто заменить вызовом метода split, чтобы получить массив строк
  • при разбитии строки по символу '+' в методе String::split(String regex) требуется экранировать этот символ в регулярном выражении.
  • необходимо извлечь число повторений из входной строки после знака + при помощи статических методов Integer.parseInt(String str) или Integer.valueOf(String str), однако эти методы "чувствительны" к формату входной строки.
  • во втором цикле не указан тип переменной цикла i
  • метод inputStr ничего не возвращает, хотя должен возвращать строку судя по своему объявлению

С учётом вышесказанного метод inputStr следует переписать так, чтобы получить строку, скопированную n раз, и переназвать его в соответствии с логикой.

public static String splitAndRepeat(String input) {
    String[] arr = input.split("\\+");
    int n = Integer.valueOf(arr[1].trim());
    StringBuilder sb = new StringBuilder(n * arr[0].length());
    for (int i = 0; i < n; i++) {
        sb.append(arr[0]);
    }
    return sb.toString();
}

Однако есть и более простой вариант решения, без явных циклов for.

Поскольку для чтения данных уже используется класс Scanner, его можно дополнительно сконфигурировать, указав разделители при вызове useDelimiter.
Тогда первую строку можно получить при помощи Scanner::next, а требуемое число повторений -- при помощи Scanner::nextInt.

Также следует заметить, что для повторения строки заданное число раз цикл for НЕ нужен, так как ещё в Java 11 был добавлен метод String::repeat(int count), реализующий этот функционал.

С учётом вышесказанного, исправленное решение может выглядеть так:

import java.util.*;

public class Main {
    public static void main(String ... args) {
        Scanner sc = new Scanner(System.in).useDelimiter("\\+\\s*|\\s*\\R");
        String input = sc.next();
        int n = sc.nextInt();
        System.out.println(input.repeat(n));
    }
}

Или даже как "однострочник" без выделения отдельных переменных input и n:

Scanner sc = new Scanner(System.in).useDelimiter("\\+\\s*|\\s*\\R");
System.out.println(sc.next().repeat(sc.nextInt()));

Здесь разделителями в сканере являются:

  • \\+\\s* - экранированный символ +, после которого идут 0 и более пробельных символов \\s
  • ИЛИ \\s*\\R - символ перевода строки \R, перед которым идут 0 и более пробельных символов \\s
→ Ссылка