public class Solution {
private static final List<String> WORDS =
Arrays.asList(
"JDK 17 has released on 14 September 2021 with 10 new features, 2 feature removals and 2 feature deprecations."
.split(" "));
public static void main(String[] args) throws NumberFormatException {
Iterator<String> words = WORDS.iterator();
int sum = 0;
String justWords = "";
try {
while (words.hasNext()) {
String next = words.next();
int number = Integer.parseInt(next);
//...продолжить код нужно здесь!!!!!
}
System.out.println("Sum is " + sum);
System.out.println("Just words:" + justWords);
} catch (NumberFormatException e) {
System.out.println(e);
}
}
}
Ольга
39 уровень
Была бы рада в помощи по решению задачи. Кто хорошо разбирается? Нужно завершить код, вычислить сумму чисел в строке, потом соединить строку без чисел с помощью разделителя пробела
Решен
Комментарии (12)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
ГоффMaster
5 октября 2022, 20:51
Поддержу vk, это задача стопудово на регулярные выражения. try - catch у нас для перехвата исключений, а не для реализации логики, для логики у нас if - else. иф-елсе в разы менее затратный, чем трай-кэтч, да и читаемость кода с ифами елсами гораздо лучше.
Я бы делал через split, покромсав строку по "\\b[0-9]*\\b" (слова, которые содержат только цифры) - получится аррэй без слов-чисел, который не проблема слепить в строку через пробел
И через сплит (по какой регулярке - подумай сама, это непросто, но возможно) получил бы аррэй со словами-числами, которые легко пропарсить и просуммировать.
Моё предложение может и не оптимальное, но полезное: регулярки - это довольно сложная в освоении тема, но это очень мощный инструмент, когда надо работать со строками. Лучше раньше, чем никогда ;-) Советую
0
ГоффMaster
5 октября 2022, 21:04
Добавлю ещё, что ты, разделяя строку на слова, сплитишь по пробелу, исходя из того, что мешающих знаков препинания в строке не будет. А если будет строка "10, 20, 30, 40?"
0
Ольга
5 октября 2022, 10:52
Eще, нужно проверить правильно ли расставлены try, catch
0
hidden #598481
5 октября 2022, 11:36
Неправильно, и это ключевая проблема.
У тебя при первом же встреченном слове (не числе) будет выброшено исключение, т.е. выполнение переместится в catch. Тебе нужно сделать наоборот: поместить весь блок try-catch внутрь цикла, обернув в него только операцию приведения строки к числу. И тогда после обработки блока catch, в случае если было обработано слово, а не строка, цикл перейдёт к следующему слову. А реализация логики после этого - чисто дело техники, думаю ты справишься с подсчётом суммы и добавлением слов в отдельный список. Вся обработка чисел будет в try, а добавление слов в отдельный список - в catch.
К слову, можно обойтись без блока try-catch при помощи регулярных выражений.
Ты можешь проверить, если слово соответствует маске word.matches("-?\\d+") - то это число, иначе простое слово. И вместо разделения логики на try и catch ты разделишь логику на if и else
+1
Ольга
5 октября 2022, 20:29
Спасибо большое за такой содержательный ответ ответ
0
Ольга
5 октября 2022, 20:34
Вот, что получилось. Но почему-то не принимается задача. Хоть и выводится все, как по условию....сумму чисел и строку без чисел.
Что-то можно еще поправить нужно?
public class Solution {
private static final List<String> WORDS =
Arrays.asList(
"JDK 17 has released on 14 September 2021 with 10 new features, 2 feature removals and 2 feature deprecations."
.split(" "));
public static void main(String[] args) {
Iterator<String> words = WORDS.iterator();
int sum = 0;
String justWords = "";
while (words.hasNext()) {
String next = words.next();
try {
int number = Integer.parseInt(next);
for (int i = 0; i <= WORDS.size(); i++) {
}
sum += number;
} catch (NumberFormatException e) {
for (int i = 0; i < WORDS.size(); i++) {
if (WORDS.get(i) == next)
if (WORDS.get(i) == next) {
justWords += WORDS.get(i) + " ";
}
}
}
}
System.out.println("Sum is " + sum);
System.out.println("Just words:" + justWords);
}
}
0
hidden #598481
5 октября 2022, 21:24
Пожалуйста.
Начни с того, что избавишься от всего лишнего.
Что за пустой бесполезный цикл без тела внутри блока try? Он ничего не делает, убери его. Ещё и с неправильным условием: никогда не используй меньше-или-равно в цикле for, выйдешь за пределы списка/массива. Но тут это неважно: пустой цикл удаляем совсем.
Почему внутри catch два одинаковых ифа? Но и тут проблема даже не в этом, они тебе вообще не нужны, как не нужен и цикл for: ты в нем перебираешь все слова из списка и вычленяешь то одно слово, которое совпадает со словом next, чтобы приклеить к твоей строке. Не находишь, что ты делаешь лишнюю работу? Если ты ищешь слово, которое содержится в переменной next, не проще взять его сразу в переменной next, и ничего не перебирать? Получается, что цикл не нужен, иф не нужен, берём слово next и приклеиваем к строке. А твой способ не работает, потому что в строке может быть два одинаковых слова, и твой поиск в этом случае приклеит слово несколько раз.
Ещё мне не нравится, что ты в конце приклеиваешь лишний пробел. Этого уже достаточно, чтобы программа не прошла тестирование. Можно, конечно, его обрезать, но лучше добавлять слова в отдельный список и склеить через String.join(). Или использовать StringBuilder, StringJoiner, StringBuffer и т.д.
+1
Ольга
6 октября 2022, 08:35
Сделала через StringBuilder, так симпатичней выглядит?
public class Solution {
private static final List<String> WORDS =
Arrays.asList(
"JDK 17 has released on 14 September 2021 with 10 new features, 2 feature removals and 2 feature deprecations."
.split(" "));
public static void main(String[] args) throws NumberFormatException {
Iterator<String> words = WORDS.iterator();
int sum = 0;
String justWords = "";
StringBuilder builder = new StringBuilder();
while (words.hasNext()) {
String next = words.next();
try {
int number = Integer.parseInt(next);
sum += number;
} catch (NumberFormatException e) {
builder.append(next);
builder.append(" ")
justWords = builder.toString();
}
}
System.out.println("Sum is " + sum);
System.out.println("Just words:" + justWords);
}
}
0
hidden #598481
6 октября 2022, 10:10
Намного.
Чтобы не было лишнего пробела в конце, можно добавить trim() перед переводом в строку или такую проверку
Ну и повторюсь, вместо try-catch можно использовать регулярку:
Но проверка должна пройти и через try-catch. +1
Ольга
6 октября 2022, 11:32
Супер, благодарю.
Сколько нужно учиться, чтобы также классно разбираться в задачах?
0
hidden #598481
7 октября 2022, 10:08
Ты задаёшь вопрос, на который не может быть однозначного ответа :)
Нет волшебной пилюли, которая начнёт действовать по щелчку пальцев: "прочитай курсы А, В, С, и через 6 месяцев будешь способна так же". Так не работает, ничего не случается одномоментно. Это всё вопрос опыта и практики, начни с малого и развивайся шаг за шагом. Всё приходит постепенно и незаметно. Я здесь начал отвечать на вопросы, кажется, 4 года назад, когда сам только проходил первые курсы на JR и изучал язык. Мне стало интересно не только писать код, но и учиться читать чужой. Я стал искать вопросы, код которых я мог понять и проанализировать, чтобы быть способным что-то посоветовать. Поначалу я мог ответить только наверное на 1 вопрос из 20, зато со временем я стал замечать, какие люди делают ошибки, как можно их избежать, каких принципов стоит придерживаться. Это шло параллельно с обучением и первым проектом на работе. Наверное где-то спустя полгода-год я стал достаточно уверен в себе, чтобы сказать, что могу прочитать код, чтобы понять, что делает программа. Я здесь говорю не про код какого-то отдельного класса, а про проект, с разными модулями, пакетами и классами. И даже сейчас порой остаются какие-то места, которые мне проще принять на веру, не разбираясь в деталях всего, что происходит под капотом, а просто закрыть некоторые фрагменты за ширмой "*MAGIC*".
Но, возвращаясь к вопросам, которые здесь задаются, повторю, ты можешь просто начать пробовать отвечать сама на те вопросы, которые можешь понять, и не заметишь, как начнёшь разбираться в них достаточно уверенно, чтобы кто-то начал к тебе стучаться в личку за советом. При этом не стоит возносить мои навыки до небес, я такой же рядовой программист, каких миллионы, с такими же сомнениями в себе и синдромом самозванца. А плашка "мастер" просто в какой-то момент появилась из-за количества данных решений.
+1
Ольга
20 октября 2022, 14:25
Очень интересует вопрос, как вы почувствовали, что пора искать первую работу?
0