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;
}

但正如你所看到的,我已经有 1 个char和 3 个临时字符串,而且感觉有些不对劲。一定有更好的方法来写这个。这很重要,因为此方法将被调用数千次(对于文本文档中的每个标记化单词)。所以它真的需要高效。

提前致谢!

4

7 回答 7

6

这个函数应该覆盖它。每个 char 只检查一次,并且不创建任何对象。

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()来确定第一个字符是否为大写。也不需要遍历字符串。

最后一个条件需要对字符串进行一次遍历,并在您第一次找到小写字符时停止。


PS 组合 2+3 标准的另一种方法是使用正则表达式(不是更有效 - 但更优雅):

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

正则表达式正在检查字符串是否以大写字母开头,然后是包含至少一个小写字符的任何序列。

于 2012-10-17T13:40:21.973 回答
1
  • 长度至少为 2 个字符
  • 第一个字符是大写的
  • 第一个字符后的剩余子字符串至少包含 1 个小写字符

代码:

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
}

如果您添加了更多条件,则必须修改最后一个条件。

于 2012-10-17T13:41:08.917 回答
1

关于什么:

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

该正则表达式以一个大写字母开头,后面至少有一个小写字母,因此符合您的要求。

于 2012-10-17T13:45:35.353 回答
0

return token.matches("[AZ]. [az]. ");

于 2014-06-13T10:28:37.647 回答
0

要查找第一个字符是否为大写:

Character.isUpperCase(token.charAt(0))

检查是否至少有一个小写字母:

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 回答