Считай слова, ява - PullRequest
       22

Считай слова, ява

1 голос
/ 28 октября 2010

Я хочу считать слова. Я использую методы hasNextChar и getChar . Предложение может содержать все виды символов. Вот мой код:

        boolean isWord = false;

        while(hasNextChar()){
            char current = getChar();   
            switch(current){
                case ' ' : case '.' : case ',' : case '-' :
                    isWord = false;
                default:
                    if(!isWord) wordCount++;
                    isWord = true;
            }
        }

Пока работает, но, например, когда у меня есть «.» в конце, это дает мне 8 вместо 7 слов. Вот несколько примеров предложений:

* „Schreiben Sie ein Praktikanten-Vermittlungs-Programm“ - слова: 6

„Du magst ja recht haben - aber ich sehe das ganz anders.“ - слова: 11

„Hallo Welt !!!!“ - слова: 2

„Zwei Wörter !!!!“ - слова: 2

„Eins, Zwei oder Drei“ - слова: 4 *

Предложение не должно заканчиваться на ".".

Есть идеи, как это решить?

Ответы [ 5 ]

7 голосов
/ 28 октября 2010

Вы забыли оператор break в первом case (после isWord = false).

3 голосов
/ 28 октября 2010

Поскольку это домашнее задание, я не буду решать его за вас, а вместо этого укажу правильное направление.

Взгляните на класс Character и вспомогательные методы, которые он определяет. (Подсказка: все они называются isXyz())

Справка:


Для этого: вот метод oneliner для подсчета слов с помощью Regex. Не используйте это решение, придумайте свое. В любом случае, это, вероятно, не то, что хотят видеть ваши учителя.

Метод:

public static int countwords(final String phrase) {
    return phrase.replaceAll("[^\\p{Alpha}]+", " ").trim().split(" ").length;
}

Тестовый код:

System.out.println(countwords(
        "Schreiben Sie ein Praktikanten-Vermittlungs-Programm"));
System.out.println(countwords(
        "Du magst ja recht haben – aber ich sehe das ganz anders."));
System.out.println(countwords("Hallo Welt !!!!"));
System.out.println(countwords("Zwei Wörter !!!!"));
System.out.println(countwords("Eins,Zwei oder Drei"));

Выход:

6
11
2
3
4

Пояснение: Чтобы использовать фразу, придуманную Генри Роллинзом: давайте доить это, не так ли?

// replace any occurrences of non-alphabetic characters with a single space
// this pattern understands unicode, so e.g. German Umlauts count as alphabetic
phrase.replaceAll("[^\\p{Alpha}]+", " ")

// trim space off beginning and end
.trim()

// split the string, using the spaces as delimiter
.split(" ")

// the length of the resulting array is the number of words
.length;
1 голос
/ 28 октября 2010

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

StringTokenizer s = new StringTokenizer(yourString, ",. :;/");
int cantWords = s.countTokens();
1 голос
/ 28 октября 2010

Комментарий Майкла МакГоуэна,

Логика кажется мне задом наперед. Разве обнаружение пробела или пунктуации не должно означать, что вы нашли слово?

И есть ли какие-то ограничения на то, как формируется ваше предложение? Если бы у вас было предложение с "One,_Two,Three,Four,____Five", тогда алгоритму потребовалась бы дополнительная логика для обработки последовательных пробелов / знаков препинания.

0 голосов
/ 28 октября 2010

Давайте рассмотрим небольшой пример: «Я есть».

Итерация 1: ток = 'I';wordCount = 1;isWord = true;

Итерация 2: текущая = '';isWord = false;wordCount = 2;isWord = true;

Итерация 3: текущий = 'a';isWord = true;

Итерация 4: current = 'm';isWord = true;

Итерация 5: текущий = '.';isWord = false;wordCount = 3;isWord = true;

Вы намеренно пропустили разрыв в вашем коммутаторе?Логика, которую вы использовали, кажется мне немного странной.

...