文字列内の大文字を数えます

ジャスティン:

私は、簡単なプログラムを作成しようとしていますという点で、カウント大文字Stringの各文字をループして文字が大文字の場合は、アキュムレータ変数をインクリメントすることによって。ここに私のコードは次のとおりです。

String str = "JuSTin"; //3 uppercase characters
int upperCaseCount = 0; //increment each time an uppercase character is encountered
char character; //the current character
for(int i = 0; i < str.length(); i++)
{
  character = str.charAt(i);
  System.out.println(character); //Log all characters to console just to see what is going on
  if(Character.isUpperCase(character))
      upperCaseCount++; 
  i++;  
}
System.out.println("Uppercase characters: " + upperCaseCount);

このコードの出力を実行したとき:

J
S
i
Uppercase characters: 2

何がこの出力を引き起こしていますか?「ジャスティン」で「U」「T」と「n」はどこにありますか?なぜupperCaseCount2及び3ないに等しいですか?

KeyMaker00:

ただ、(自分の学習目的のために)補足情報として、あなたが使用してさまざまな方法でそれを解決することができます:

  • ラムダ、
  • ループのための「クラシック」、
  • Javaの7で導入されたループ構造、
  • 正規表現、
  • またはforeachループ

これらの方法のそれぞれが独自の利点や欠点を持っています。

ラムダと

public static long countUpperCase(final String str) {
        return str
                .chars() // get all chars from the argument
                .filter(c -> Character.isUpperCase(c)) // filter only the uppercase
                .count(); // count the uppercase
    }

ループのための古典と

public static long countUpperCase(final String str) {
    long counter = 0;

    for(int i=0; i<str.length(); i++) {
        if(Character.isUpperCase(str.charAt(i))) {
            counter++;
        }
    }
    return counter;
}

新しいループ構造を持つ(Javaの7以上)

public static long countUpperCase(final String str) {
    long counter = 0;

    for(final char c: str.toCharArray()) {
        if(Character.isUpperCase(c)) {
            counter++;
        }
    }
    return counter;
}

他の記事では、いくつかの説明がすでにありますが、例えば大文字SOポスト

正規表現

public static long countUpperCase(final String str) {
    // \p{L} matches a single code point in the category "letter"
    // \p{L} matches all letters that are uppercase
    return str.split("(?=\\p{Lu})").length;
}

:あなたはより深いビットを掘るのは興味深いしている場合、この興味深いPDFで顔をしている正規表現のガイド

foreachループ付き

public static long countUpperCase(final String str) {
    // the 'var' keyword can be used with Java 10 or higher
    final var counter = new AtomicInteger(0);

    // convert a string into a List<Character>
    // Note that this is only applicable since Java 8 or higher
    var chars = str
            .chars()
            .mapToObj(c -> (char) c)
            .collect(Collectors.toList());

    // count the number of uppercase letters
    chars.forEach(c -> {
        if(Character.isUpperCase(c)) {
            counter.incrementAndGet();
        }
    });

    return counter.get();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=224647&siteId=1