Словом считается слово, состоящее только из букв, не содержащее в себе цифры и спецсимволы. Я строку разделил на массив слов по пробелу используя split()
. Потом считаю нулевой элемент максимальным и через цикл сравниваю остальные, но если первое слово в строке начинается с цифры или спецсимвола, то оно считается как слово, а не должно. Как мне это исправить, подскажите ?
public static void main(String[] args) {
String str = "3There 7has !been 9divided abs- on98 then issue, with 578934 784, +moderates5789 9concerned @about then on: then most vulnerable.";
System.out.println(maxWord(str));
}
private static boolean isValidWord(String word) {
char[] chars = word.toCharArray();
for (char c : chars) {
if (!Character.isLetter(c)) {
return false;
}
}
return !word.trim().isEmpty();
}
public static String maxWord(String input) {
String[] words = input.split("\\s+");
String max = words[0];
for (String word : words) {
if (isValidWord(word) && word.length() > max.length()) {
max = word;
}
}
return max;
}
Вы написали следующий код:
String[] words = input.split("\\s+");
String max = words[0];
Проблема в том, что words[0]
не проверяется функцией isValidWord()
!
Исправить можно разными способами:
- использовать совет от Alex Chermenin насчет инициализации пустой строкой
- предварительно отфильтровать массив words[], исключив из него "неправильные"
слова
А вообще, я бы посоветовал использовать регулярные выражения в данном случае более полно, чтобы не изобретать велосипед. Благо, что регулярка для разделения слов получается в данном случае очень простая - разделителями будут все символы, не являющиеся буквами.
Примерно так:
String[] words = s.split("[^a-zA-Z]+")
Пример реализации:
import java.util.regex.*;
import java.util.stream.*;
public class Solution
{
private static final Pattern pattern = Pattern.compile("[^a-zA-Z]+");
private static void test(String s)
{
System.out.format("input string: '%s'\n", s);
String[] words = pattern.split(s);
//String[] words = s.split("[^a-zA-Z]+");
// это уже необязательно - просто чтобы пустое слово не выводить как максимальное
words = Stream.of(words).filter(v -> v.length() > 0).toArray(String[]::new);
if ( words.length > 0 )
{
int max_len = words[0].length();
int max_idx = 0;
for ( int i = 1; i < words.length; ++i )
if ( words[i].length() > max_len )
{
max_len = words[i].length();
max_idx = i;
}
System.out.format(" the longest word is %d-th with length %d: '%s'\n", max_idx + 1, max_len, words[max_idx]);
}
else
System.out.format(" no words found inside the string: '%s'\n", s);
}
public static void main(String[] args)
{
test("");
test("!@#$");
test("single");
test("@#_word_01_!?");
test("__first, second; third...longest__'last'__////");
test("3There 7has !been 9divided abs- on98 then issue, with 578934 784, +moderates5789 9concerned @about then on: then most vulnerable.");
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть проект с кучей классов и надо его декомпилировать, однако вручную с каждым классом возиться (1000+ классов) весьма затруднительноНельзя...
Собственно проблемаЕсть приложение читающее файл и рассчитывающее статистику для его строк, с консольной частью и выводом данных в веб
Есть вопросКак запускать некоторые проекты в IDEA?нажимаю на run,а высвечивается - 0