1

文字列を受け入れるメソッドを記述し、それが次の基準を満たしているかどうかを判断するための効率的な方法(文字列を10,000回スキャンしない、一時的な結果を保持するための中間文字列を大量に作成する、または文字列のバッシングなど)を見つけたいと思います。 :

  • 2文字以上の長さです
  • 最初の文字は大文字です
  • 最初の文字の後の残りの部分文字列には、少なくとも1つの小文字が含まれています

これまでの私の試みは次のとおりです。

private boolean isInProperForm(final String token) {
    if(token.length() < 2)
        return false;

    char firstChar = token.charAt(0);
    String restOfToken = token.substring(1);
    String firstCharAsString = firstChar + "";
    String firstCharStrToUpper = firstCharAsString.toUpperCase();

    // TODO: Giving up because this already seems way too complicated/inefficient.
    // Ignore the '&& true' clause - left it there as a placeholder so it wouldn't  give a compile error.
    if(firstCharStrToUpper.equals(firstCharAsString) && true)
        return true;

    // Presume false if we get here.
    return false;
}

しかし、ご覧charのとおり、私はすでに1つと3つの一時的な文字列を持っており、何かが正しく感じられません。これを書くためのより良い方法がなければなりません。このメソッドは(テキストドキュメント内のトークン化された単語ごとに)何千回も呼び出されるため、重要です。ですから、それは本当に効率的である必要があります。

前もって感謝します!

4

7 に答える 7

6

This function should cover it. Each char is examined only once and no objects are created.

public static boolean validate(String token) {
  if (token == null || token.length() < 2) return false;
  if (!Character.isUpperCase(token.charAt(0)) return false;
  for (int i = 1; i < token.length(); i++)
    if (Character.isLowerCase(token.charAt(i)) return true;
  return false;
于 2012-10-17T13:40:52.160 に答える
2

最初の基準は単純ですlength-このデータは文字列オブジェクトにキャッシュされ、文字列をトラバースする必要はありません。

Character.isUpperCase()最初の文字が大文字かどうかを判断するために使用できます。文字列をトラバースする必要もありません。

最後の基準では、文字列を1回トラバースする必要があり、小文字を最初に見つけたときに停止します。


PS 2 + 3基準を組み合わせた別の方法は、正規表現を使用することです(より効率的ではありませんが、よりエレガントです)。

return token.matches("[A-Z].*[a-z].*");

正規表現は、文字列が大文字で始まり、その後に少なくとも1つの小文字を含むシーケンスが続くかどうかをチェックしています。

于 2012-10-17T13:40:21.973 に答える
1
  • It is at least 2 characters in length
  • The first character is uppercased
  • The remaining substring after the first character contains at least 1 lowercased character

Code:

private boolean isInProperForm(final String token) {
    if(token.length() < 2) return false;
    if(!Character.isUpperCase(token.charAt(0)) return false;
    for(int i = 1; i < token.length(); i++) {
        if(Character.isLowerCase(token.charAt(i)) {
            return true; // our last criteria, so we are free 
                         // to return on a met condition
        }
    }
    return false; // didn't meet the last criteria, so we return false
}

If you added more criteria, you'd have to revise the last condition.

于 2012-10-17T13:41:08.917 に答える
1

What about:

return token.matches("[A-Z].*[a-z].*");

This regular expression starts with an uppercase letter and has at least one following lowercase letter and therefore meets your requirements.

于 2012-10-17T13:45:35.353 に答える
0

最初の文字が大文字かどうかを確認するには:

Character.isUpperCase(token.charAt(0))

小文字が少なくとも1つあるかどうかを確認するには、次のようにします。

if(Pattern.compile("[a-z]").matcher(token).find()) {
    //At least one lowercase
}
于 2012-10-17T13:39:47.460 に答える
0

最初の文字が大文字かどうかを確認するには、次を使用できます。

Character.isUpperCase(s.charAt(0))
于 2012-10-17T13:39:52.407 に答える
0

return token.matches("[A-Z].[a-z].");

于 2014-06-13T10:28:37.647 に答える