Как найти количество слов в строке java

Как посчитать количество элементов (подстрок, разделяемых пробелами) строки на Java?

Nicolas Chabanovsky's user avatar

задан 3 мая 2012 в 20:01

Andrey2517's user avatar

Andrey2517Andrey2517

853 золотых знака5 серебряных знаков14 бронзовых знаков

3

Если только пробелы разделители, то можно

int blockCount = "1215 544 965".split(" ").length;

Если пробелов между словами несколько

int blockCount = "1215     544      965".split(" +").length;

ответ дан 4 мая 2012 в 6:40

IronVbif's user avatar

2

Используйте StringTokenizer и Вашу строку

StringTokenizer ins = new StringTokenizer(myString);
int cnt = 0;
while (ins.hasMoreTokens()) cnt++;

В cnt будет количество слов (Вы их элементами зовете).

ответ дан 3 мая 2012 в 20:37

avp's user avatar

avpavp

45.6k6 золотых знаков45 серебряных знаков115 бронзовых знаков

StringTokenizer ins = new StringTokenizer("");
BufferedReader inb = new BufferedReader(new InputStreamReader(System.in));

public String nextLine() throws Exception {
    return inb.readLine();
}

public String nextStr() throws Exception {
    while (!ins.hasMoreTokens())
        ins = new StringTokenizer(nextLine());
    return ins.nextToken();
}

public static void main(String[] args) throws Exception {
    String s = "";
    int count = 0;
    while ((s = nextStr()) != null)
        count++;
    System.out.print(count);

}

ответ дан 3 мая 2012 в 20:24

Gonza12's user avatar

Gonza12Gonza12

1412 серебряных знака14 бронзовых знаков

6

int counter = 0;

String text = "some text";
Matcher matcher = Pattern.compile("(\\s+)?\\S+(\\s*)?").matcher(text);

while(matcher.find()){
    counter++;
}

Nicolas Chabanovsky's user avatar

ответ дан 16 янв 2017 в 20:20

Roberto's user avatar

RobertoRoberto

1,1731 золотой знак12 серебряных знаков25 бронзовых знаков

1

String[] word=s.split("\s+");
System.out.println(word.length);

Suvitruf - Andrei Apanasik's user avatar

ответ дан 10 фев 2019 в 22:10

NoName's user avatar

Данная статья написана командой Vertex Academy. Это одна из статей из нашего “Самоучителя по Java.”

Напишите программу HowMany.java, которая определит, сколько слов Вы ввели с консоли.

Решение:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import java.util.Scanner;

public class HowMany {

        public static void main(String[] args) {

            Scanner sc = new Scanner(System.in);

            //Вводим предложение в консоль

            System.out.println(“Введите слова одной строкой через пробел”);

            String input = sc.nextLine();

            //Начальное количество слов равно 0

            int count = 0;

            //Если ввели хотя бы одно слово, тогда считать, иначе конец программы

            if(input.length() != 0){

                count++;

                //Проверяем каждый символ, не пробел ли это

                for (int i = 0; i < input.length(); i++) {

                    if(input.charAt(i) == ‘ ‘){

                        //Если пробел – увеличиваем количество слов на 1

                        count++;

                    }

                }

            }

            System.out.println(“Вы ввели “+count+“слов”);

        }

}


Надеемся – наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.

  • java строки

Ответы

Аватар пользователя Сергей Якимович

Сергей Якимович

28 ноября 2022

Посчитать слова в строке можно разбив строку на слова методом split()

        String text = "Hello, World! My name is Ivan!";

        String[] arr = text.split(" ");

        System.out.println(arr.length); // => 6



1



0

Добавьте ваш ответ

Рекомендуемые курсы

курс

Java: Введение в ООП

11 часов

Старт в любое время

курс

Java: Веб-технологии

69 часов

Старт в любое время

курс

Java: Основы ООП

35 часов

Старт в любое время

Похожие вопросы

  • java строки

Как посчитать количество строк в java


23 ноября 2021

1

ответ

Как посчитать количество букв в строке java


21 декабря 2021

2

ответа

Как посчитать количество символов в строке java


21 декабря 2021

1

ответ

  • java строки

Как удалить повторяющиеся слово в строке java


23 ноября 2021

3

ответа

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы рассмотрим различные способы подсчета слов в заданной строке с использованием Java.

2. Использование StringTokenizer

Простой способ подсчета слов в строке в Java-это использовать класс StringTokenizer :

assertEquals(3, new StringTokenizer("three blind mice").countTokens());
assertEquals(4, new StringTokenizer("seethowttheytrun").countTokens());

Обратите внимание , что StringTokenizer автоматически заботится о пробелах для нас , таких как вкладки и возврат каретки.

Но в некоторых местах это может быть неправильно, например, дефисы:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque").countTokens());

В этом случае мы хотели бы, чтобы “жена” и “она” были разными словами, но поскольку между ними нет пробелов, значения по умолчанию нас подводят.

К счастью, StringTokenizer поставляется с другим конструктором. Мы можем передать разделитель в конструктор, чтобы выполнить вышеуказанную работу:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque", " -").countTokens());

Это удобно при попытке подсчитать слова в строке из что-то вроде CSV-файла:

assertEquals(10, new StringTokenizer("did,you,ever,see,such,a,sight,in,your,life", ",").countTokens());

Итак, StringTokenizer прост, и он помогает нам в этом большую часть пути.

Давайте посмотрим, какие дополнительные лошадиные силы могут дать нам регулярные выражения.

3. Регулярные выражения

Чтобы придумать осмысленное регулярное выражение для этой задачи, нам нужно определить, что мы считаем словом: слово начинается с буквы и заканчивается либо пробелом, либо знаком препинания .

Имея это в виду, учитывая строку, мы хотим разделить эту строку в каждой точке, где мы сталкиваемся с пробелами и знаками препинания, а затем подсчитать полученные слова.

assertEquals(7, countWordsUsingRegex("the farmer's wife--she was from Albuquerque"));

Давайте немного провернем все, чтобы увидеть силу регулярных выражений:

assertEquals(9, countWordsUsingRegex("no&one#should%ever-write-like,this;but:well"));

Нецелесообразно решать эту проблему, просто передавая разделитель в StringTokenizer , так как нам придется определить действительно длинный разделитель, чтобы попытаться перечислить все возможные знаки препинания.

Оказывается, нам действительно не нужно много делать, передавая регулярное выражение [pPs&&[^’]]+ к |/split методу класса String сделает трюк :

public static int countWordsUsingRegex(String arg) {
    if (arg == null) {
        return 0;
    }
    final String[] words = arg.split("[pPs&&[^']]+");
    return words.length;
}

Регулярное выражение [pPs&&[^’]]+ находит любую длину знаков препинания или пробелов и игнорирует знак препинания апострофа.

Чтобы узнать больше о регулярных выражениях, обратитесь к Регулярным выражениям в Baeldung .

4. Циклы и строковый API

Другой метод состоит в том, чтобы иметь флаг, который отслеживает слова, которые были встречены.

Мы устанавливаем флаг в WORD при обнаружении нового слова и увеличиваем количество слов, а затем возвращаемся к РАЗДЕЛИТЕЛЮ , когда мы сталкиваемся с не-словом (знаки препинания или пробелы).

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

assertEquals(9, countWordsManually("no&one#should%ever-write-like,this but   well"));

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

assertEquals(6, countWordsManually("the farmer's wife--she was from Albuquerque"));

То, что мы хотим здесь, – это считать “фермерское” одним словом, хотя апостроф “‘” является знаком препинания.

В версии регулярного выражения у нас была гибкость, чтобы определить, что не квалифицируется как символ, используя регулярное выражение. Но теперь, когда мы пишем нашу собственную реализацию, мы должны определить это исключение в отдельном методе :

private static boolean isAllowedInWord(char charAt) {
    return charAt == ''' || Character.isLetter(charAt);
}

Итак, то, что мы здесь сделали, – это разрешить в слове все символы и законные знаки препинания, в данном случае апостроф.

Теперь мы можем использовать этот метод в нашей реализации:

public static int countWordsManually(String arg) {
    if (arg == null) {
        return 0;
    }
    int flag = SEPARATOR;
    int count = 0;
    int stringLength = arg.length();
    int characterCounter = 0;

    while (characterCounter < stringLength) {
        if (isAllowedInWord(arg.charAt(characterCounter)) && flag == SEPARATOR) {
            flag = WORD;
            count++;
        } else if (!isAllowedInWord(arg.charAt(characterCounter))) {
            flag = SEPARATOR;
        }
        characterCounter++;
    }
    return count;
}

Первое условие помечает слово, когда оно встречается, и увеличивает счетчик. Второе условие проверяет, не является ли символ буквой, и устанавливает флаг в РАЗДЕЛИТЕЛЬ .

5. Заключение

В этом уроке мы рассмотрели способы подсчета слов с использованием нескольких подходов. Мы можем выбрать любой в зависимости от вашего конкретного случая использования.

Как обычно, исходный код этого учебника можно найти на GitHub .

1. Обзор

В этом руководстве мы рассмотрим различные способы подсчета слов в заданной строке с помощью Java.

2. Использование StringTokenizer

Простой способ подсчета слов в строке в Java – использовать класс StringTokenizer :

assertEquals(3, new StringTokenizer("three blind mice").countTokens()); assertEquals(4, new StringTokenizer("seethowttheytrun").countTokens());

Обратите внимание, что StringTokenizer автоматически обрабатывает пробелы , например табуляции и возврат каретки.

Но в некоторых местах это может быть глупо, например дефисы:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque").countTokens());

В этом случае мы бы хотели, чтобы «жена» и «она» были разными словами, но поскольку между ними нет пробелов, значения по умолчанию нас не подводят.

К счастью, StringTokenizer поставляется с другим конструктором. Мы можем передать в конструктор разделитель, чтобы это работало:

assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque", " -").countTokens());

Это удобно при попытке подсчитать количество слов в строке из чего-то вроде файла CSV:

assertEquals(10, new StringTokenizer("did,you,ever,see,such,a,sight,in,your,life", ",").countTokens());

Итак, StringTokenizer прост, и он помогает нам в этом.

Давайте посмотрим, какую дополнительную мощность могут дать нам регулярные выражения.

3. Регулярные выражения

Чтобы придумать осмысленное регулярное выражение для этой задачи, нам нужно определить, что мы считаем словом: слово начинается с буквы и заканчивается либо пробелом, либо знаком препинания .

Имея это в виду, для данной строки мы хотим разделить эту строку в каждой точке, где встречаются пробелы и знаки препинания, а затем подсчитать полученные слова.

assertEquals(7, countWordsUsingRegex("the farmer's wife--she was from Albuquerque"));

Давайте немного поработаем, чтобы увидеть мощь регулярного выражения:

assertEquals(9, countWordsUsingRegex("no&one#should%ever-write-like,this;but:well"));

Непрактично решать эту проблему, просто передавая разделитель в StringTokenizer, поскольку нам пришлось бы определить действительно длинный разделитель, чтобы попытаться перечислить все возможные знаки препинания.

Оказывается, нам действительно не нужно много делать, передача регулярного выражения [ pP s && [^ ‘]] + в метод split класса String сделает свое дело :

public static int countWordsUsingRegex(String arg) { if (arg == null) { return 0; } final String[] words = arg.split("[pPs&&[^']]+"); return words.length; }

Регулярное выражение [ pP s && [^ ‘]] + находит любую длину знаков препинания или пробелов и игнорирует знак препинания апострофа.

Чтобы узнать больше о регулярных выражениях, обратитесь к Регулярным выражениям на Baeldung.

4. Циклы и String API

Другой метод – установить флаг, отслеживающий встреченные слова.

Мы устанавливаем флаг в WORD, когда встречаем новое слово, и увеличиваем счетчик слов, а затем возвращаемся в SEPARATOR, когда мы встречаем неслово (знаки пунктуации или пробелы).

Этот подход дает те же результаты, что и с регулярными выражениями:

assertEquals(9, countWordsManually("no&one#should%ever-write-like,this but well")); 

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

assertEquals(6, countWordsManually("the farmer's wife--she was from Albuquerque"));

Здесь мы хотим считать «фермерское» одним словом, хотя апостроф «’» – это знак препинания.

В версии с регулярным выражением у нас была возможность определить, что не квалифицируется как символ, с помощью регулярного выражения. Но теперь, когда мы пишем нашу собственную реализацию, мы должны определить это исключение в отдельном методе :

private static boolean isAllowedInWord(char charAt)  

Итак, что мы сделали здесь, так это разрешить одним словом все символы и допустимые знаки препинания, в данном случае апостроф.

Теперь мы можем использовать этот метод в нашей реализации:

public static int countWordsManually(String arg) { if (arg == null) { return 0; } int flag = SEPARATOR; int count = 0; int stringLength = arg.length(); int characterCounter = 0; while (characterCounter < stringLength) { if (isAllowedInWord(arg.charAt(characterCounter)) && flag == SEPARATOR) { flag = WORD; count++; } else if (!isAllowedInWord(arg.charAt(characterCounter))) { flag = SEPARATOR; } characterCounter++; } return count; }

Первое условие отмечает слово, когда оно встречается, и увеличивает счетчик. Второе условие проверяет, не является ли символ буквой, и устанавливает флаг в SEPARATOR .

5. Заключение

В этом уроке мы рассмотрели способы подсчета слов, используя несколько подходов. Мы можем выбрать любой в зависимости от нашего конкретного сценария использования.

Как обычно, исходный код этого руководства можно найти на GitHub.


Добавить комментарий