2016-05-05 8 views
-2

Ich muss die Gesamtzahl der Großbuchstaben in einer Zeichenfolge zählen, aber ich kann einfach nicht herausfinden, wie es ohne komplexe if-Anweisungen und Prüfungen zu tun.Wie zählen Großbuchstaben in einer Zeichenfolge in Java?

Ich habe versucht, und so etwas wie dies niedergeschrieben:

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

    } 

    return count; 

} 

Und ich habe immer noch keine Ahnung von einem guten Zustand meines Bedürfnis zu entsprechen. Die Sache ist, dass ich mich mit ganzen Wörtern beschäftigen muss (Sonderzeichen wie Ausrufezeichen zählen für die Zwecke der Methode als Großbuchstaben) und nicht einzelne Zeichen, da der Rest des Systems, das ich schreibe, bereits tut.

+2

Was ist falsch beim Schreiben mehrerer Checks oder komplexer if-Anweisungen? – Brian

+0

Brechen Sie das Problem ab. Was geht in den ??? Teil? Wahrscheinlich so etwas wie "Wenn dies ein Großbuchstabe ist, erhöhen Sie den Zähler." Also schreibe diese Bedingung auf und ersetze "Ist das ein Großbuchstabe?" mit einer Methode, die Boolean zurückgibt. Jetzt müssen Sie diese Methode implementieren, aber es ist ein einfacheres Problem zu lösen. – yshavit

+0

@Brian Solange es einfachere Lösungen gibt, bleibe ich lieber bei ihnen, Ockhams Rasiermesser für den Sieg! Wie auch immer, ich habe es geschafft, eine befriedigende Antwort zu finden, danke für das Interesse! – Anacarnil

Antwort

1

Sie könnten jede Zeichenfolge über den split()-Aufruf teilen, wie Sie gerade tun, um jedes Wort zu erhalten. An dieser Stelle haben Sie Optionen, mit denen Sie die einzelnen Wörter vergleichen können, um festzustellen, ob sie in Großbuchstaben geschrieben sind.

Vergleichen Sie Ihren String zu einem Groß Version

Sie auch auch mit der toUpperCase() Methode und erhöht entsprechend

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

Check Den String mit einem regulären dem String in seinem entsprechenden Großbuchstaben vergleichen könnte Ausdruck

Sie können auch einen regulären Ausdruck verwenden, um alle Zeichen zu sehen innerhalb des Strings werden über die matches() Methode groß geschrieben:

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

War es so einfach? Vielen Dank! Wie Sie sehen können, habe ich etwas Rost aufgestapelt, da ich seit ein paar Jahren in Java nichts geschrieben habe. : D – Anacarnil

+0

's == s.toUpperCase()' sollte wahrscheinlich 's.equals sein (s.toUpperCase())' Die Implementierung in JDK 7 gibt 'this' zurück, falls die Zeichenfolge bereits Großbuchstaben hat ; aber dieses Verhalten ist im Methodenvertrag nicht angegeben, daher würde ich mich persönlich nicht darauf verlassen wollen. (Zumal 'String # gleich 'fast-tracks ist, um wahr zurückzugeben, wenn die beiden Instanzen sowieso gleich sind.) – yshavit

+0

Toller Punkt. Es ist lange her, dass ich Java schreiben musste, ich werde es entsprechend aktualisieren. –

1

Dies ist, wie es 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(); 
} 

mit zu tun und wenn Bedarfsbrief in Großbuchstaben in dem Eintrag zählen:

public static long countUpperCase(String input) { 

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

Und wenn Sie dies mit mehr Generika-Code verbessern möchten, könnten Sie es so schreiben:

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

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

Und Aufruf diese util Methode von Ihrem Prädikat als Lambda-Ausdruck auf die Methode übergeben:

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

Versuchen Sie die erste Methode in meiner Bearbeitung, tut mir leid, die zweite Methode ist, Großbuchstaben in den Eintrag –

+0

zählen Ich bin nicht gewohnt, Java 8, können Sie bitte diese Methoden kommentieren Sie geschrieben haben? Vielen Dank! – Anacarnil

0

Der einfache Weg ist Ihre „Großbuchstaben Wortmuster“ zu definieren und dann Begegnungen gegen sie zählt:

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); 
Verwandte Themen