Java:确定String是否符合多个条件的有效方法?

时间:2012-10-17 13:36:29

标签: java string algorithm

我想找到高效方式(不扫描字符串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个临时字符串,而且感觉不对劲。必须有一个更好的方式来写这个。这很重要,因为这种方法将被调用成千上万次(对于文本文档中的每个标记化单词)。所以它确实需要高效。

提前致谢!

7 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

第一个标准就是length - 这个数据缓存在字符串对象中,不需要遍历字符串。

您可以使用Character.isUpperCase()来确定第一个字符是否为大写字母。不需要遍历字符串。

最后一个标准要求在字符串上进行单次遍历,并在第一次找到小写字符时停止。


P.S。 2 + 3标准的替代方案是使用regex(效率不高 - 但更优雅):

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

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

答案 2 :(得分: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
}

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

答案 3 :(得分:1)

怎么样:

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

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

答案 4 :(得分:0)

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

Character.isUpperCase(token.charAt(0))

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

if(Pattern.compile("[a-z]").matcher(token).find()) {
    //At least one lowercase
}

答案 5 :(得分:0)

要检查第一个字符是否为大写,您可以使用:

Character.isUpperCase(s.charAt(0))

答案 6 :(得分:0)

return token.matches(“[A-Z]。 [a-z]。”);