Как распознать самое длинное буквенное слово в массиве строк в Java? (любая подстрока без символов или цифр)

#java #arrays #string #character

#java #массивы #строка #символ

Вопрос:

Я новичок в Java, и мне нужно решить упражнение, которое требует следующего:

Для строки, которую вводит пользователь, верните самое большое слово (пока здесь все хорошо)

Но следует учитывать, что числа и символы не являются словами.

Например: Hello, my name is Jonathan and my phone is 0123456789 должно возвращать "Jonathan" как самое длинное слово.

Пример 2: H3llo W0rld, Java 1s fun! , должно возвращать "Java" как самое длинное слово.

В моем псевдокоде я думал о следующем:
A) Запросить ввод от пользователя.
Б) При недопустимом вводе выполняется цикл.
C) Сканируйте входные данные
D) Разделяйте слова пробелами или токенами.
E) Если Word содержит только буквы A-Z amp;amp; a-z, выполните следующий код:
e1) Проверьте, есть ли самое длинное слово, с помощью a for.
e2) Вывести результат
F) еще, если: перейти к следующему слову.

Вот код, который у меня есть на данный момент. Как вы видите, многие части взяты отсюда и адаптированы к коду. «Найти самое длинное в массиве» — популярная тема, но я не могу выполнить проверку на наличие алфавитных символов. Любая помощь будет приветствоваться.

Проблема в том, что я не знаю, как реализовать часть, которая проверяет наличие букв.

Код:

 package longestword;

import java.util.Scanner;

public class LongestWord {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a String: ");

        //looping for non empty strings
        int largestLength = 0;
        String largestWord = "";
        String userinput = sc.nextLine();
        while (userinput.equals("")) {
            System.out.println("Please insert a String: ");
            userinput = sc.nextLine();
        }

        for (String b : userinput.split(" ")) {
            if (largestWord.length() == 0) {
                largestLength = b.length();
                largestWord = b;
            } else if (b.length() >= largestLength) {
                largestLength = b.length();
                largestWord = b;
            }
        }
        sc.close();
        System.out.println("Longest Word: "   largestWord);

    }

    public boolean isAlpha(String userinput) {
        char[] chars = userinput.toCharArray();

        for (char c : chars) {
            if (!Character.isLetter(c)) {
                return false;
            }
        }
        return true;
    }
}
/*

     char c = '*';

        if( (c >= 'a' amp;amp; c <= 'z') || (c >= 'A' amp;amp; c <= 'Z'))
            System.out.println(c   " is an alphabet.");
        else
            System.out.println(c   " is not an alphabet.");
    }
}
*/
  

Комментарии:

1. Почему вы не используете свой isAlpha метод?

2. Я пытаюсь, просто не знал, как это реализовать

Ответ №1:

Просто измените свой isAlpha метод на static и используйте его следующим образом:

 for (String b : userinput.split(" ")) {
    if (isAlpha(b)) {
        if (largestWord.length() == 0) {
            largestLength = b.length();
            largestWord = b;
        } else if (b.length() >= largestLength) {
            largestLength = b.length();
            largestWord = b;
        }
    }
}
  

Комментарии:

1. Спасибо! Мне просто нужно поискать, как преобразовать его в Static, но это не должно быть проблемой. Спасибо Eran за вашу помощь! Действительно ценю это :).

2. @jonakru это просто — public static boolean isAlpha(String userinput) {}...

3. Спасибо Eran за все. Что мне было нужно, так это реализация IsAlpha. Прямо сейчас код не работает должным образом для строки: «asdasd asd4a65sd4a6s5d4a6sd a6s5d4a6s5d4a ssddaassssddddddddd Я получил 3 строки самого длинного слова: asdasd и затем правильный ответ. Исправить это должен я. Спасибо за предоставленную помощь!

4. @jonakru странно — я попробовал этот ввод и получил просто «Самое длинное слово: ssddaassssdddddddddd»

5. Обнаружена ошибка, я не туда поместил «}», который включал System.out.println. Итак, при каждой проверке слова печаталось самое длинное слово на данный момент. Спасибо!!!!!!!!!!!!!!

Ответ №2:

Возможно, более простым подходом могло бы быть разделение строки любым небуквенным символом, и пусть потоки Java сделают тяжелую работу за вас:

 String longestWorld =
    Arrays.stream(userInput.split("[^a-zA-z]"))
          .max(Comparator.comparing(String::length).reversed())
          .orElse(null);
  

Комментарии:

1. Спасибо за ваш ответ. В этом вы, вероятно, правы. Так получилось, что прямо сейчас я нахожусь в начале курса, поэтому от нас ожидается использование циклов For , While, более простых вещей.