Помогите исправить ошибку в методе при нахождении самого длинного слова в строке

184
26 июля 2017, 21:05

Словом считается слово, состоящее только из букв, не содержащее в себе цифры и спецсимволы. Я строку разделил на массив слов по пробелу используя 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;
}
Answer 1

Вы написали следующий код:

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.");
    }
}
READ ALSO
Декомпилятор Intellij

Декомпилятор Intellij

Есть проект с кучей классов и надо его декомпилировать, однако вручную с каждым классом возиться (1000+ классов) весьма затруднительноНельзя...

228
Spring controller не находит файл ресурса

Spring controller не находит файл ресурса

Собственно проблемаЕсть приложение читающее файл и рассчитывающее статистику для его строк, с консольной частью и выводом данных в веб

211
Как использовать Font в старых Android?

Как использовать Font в старых Android?

Слышал что появилось новое в AndroidСпустя тысячелетие

200
Intellij IDEA - запуск проекта

Intellij IDEA - запуск проекта

Есть вопросКак запускать некоторые проекты в IDEA?нажимаю на run,а высвечивается - 0

412