2016-05-05 10 views
-2

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

Я попробовал и записал что-то вроде этого:

private int uppercaseWordsCount(String input){ 
    count = 0; 
    String[] ss = input.split("\\s"); 
    for (String s: ss){ 
     //??? 
     } 

    } 

    return count; 

} 

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

+2

Что случилось с написанием нескольких проверок или сложных операторов if? – Brian

+0

Прервать проблему. Что входит в '' 'часть? Вероятно, что-то вроде: «если это слово в верхнем регистре, увеличьте счетчик». Итак, напишите это условие, заменив «это заглавное слово?» с методом, который возвращает boolean. Теперь вам нужно реализовать этот метод, но решить эту проблему проще. – yshavit

+0

@Brian Пока есть более простые решения, я предпочитаю придерживаться их, бритвы Оккама для победы! В любом случае, мне удалось найти удовлетворительный ответ, спасибо за интерес! – Anacarnil

ответ

1

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

сравнить ваши строки в верхнем регистре

Вы также могли бы сравнить строку с его прописным эквивалентом, а также с использованием метода toUpperCase() и увеличивать соответственно

// The string is the same as an upper-cased version of itself 
if(s.equals(s.toUpperCase())){ 
    // Then increment your count 
    count++; 
} 

Проверьте строку с регулярным Выражение

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

// Increment your count if the string consists of only uppercase characters 
if(s.matches("^[A-Z]+$")){ 
    count++; 
} 
+0

Было ли это так просто? Большое спасибо! Как вы можете видеть, я собрал некоторую ржавчину, поскольку я ничего не писал на Java уже пару лет. : D – Anacarnil

+0

's == s.toUpperCase()' должно быть, вероятно, 's.equals (s.toUpperCase())' Реализация в JDK 7 действительно возвращает 'this' в том случае, если строка уже имеет верхний регистр ; но это поведение не указано в контракте метода, поэтому я лично не хотел бы полагаться на него. (Тем более, что 'String # equals' fast-tracks возвращает true, если оба экземпляра одинаковы.) – yshavit

+0

Отличная точка. Прошло много времени с тех пор, как мне пришлось писать любую Java, поэтому я ее обновлю. –

1

Это, как сделать это с помощью Java 8

public static long countUpperCaseWord(String input) { 
    // your object must be not null 
    Objects.requireNonNull(input); 

    // new stream of the array returned by the split call on input string 
    return Stream.of(input.split("\\s")) 
       // we create a second stream that match the predicate passed throw the method filter 
       .filter(word -> word.equals(word.toUpperCase())) 
       // finally we want to count how many words match this predicate 
       .count(); 
} 

А если нужно посчитать буквы в верхнем регистре в записи:

public static long countUpperCase(String input) { 

    return input.chars() 
       .map(i -> (char) i) 
       .filter(c -> Character.isUpperCase(c)) 
       .count(); 
    } 

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

public static long countWordsUsingPredicate(String input, Predicate<String> predicate) { 
    Objects.requireNonNull(input); 

    return Stream.of(input.split("\\s")) 
       .filter(predicate) 
       .count(); 
} 

И вызывать этот метод Util, передавая свой предикат, как лямбда-выражения к методу:

countUpperCaseWord("THIS BREAK", word -> word.equals(word.toUpperCase())) 
+0

Попробуйте первый метод в моем редактировании, извините, второй метод - считать букву в верхнем регистре в записи –

+0

Я не привык к Java 8, не могли бы вы прокомментировать те методы, которые вы написали? Спасибо! – Anacarnil

0

Простой способ является определить свой «верхний регистр образец слово», а затем рассчитывать матчи против него:

Pattern pattern = Pattern.compile("\b[A-Z\!\@\$\%\^\&\*\(\)\[\]]\S+\b"); 
Matcher matcher = pattern.matcher("Your Input String Here"); 
int count = 0; 
while (matcher.find()) { count++; } 
System.out.printf("%d uppercase words.%n", count);