Как решить задачу, используя цикл 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 шт):
Код, представленный в вопросе, совершенно НЕ рабочий -- он не компилируется НЕ только из-за сравнения числа со строкой 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