我想找到高效方式(不扫描字符串10,000次,或者创建大量中间字符串来保存临时结果,或者字符串抨击等)来编写一个接受的方法一个字符串并确定它是否符合以下条件:
到目前为止,这是我的尝试:
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个临时字符串,而且感觉不对劲。必须有一个更好的方式来写这个。这很重要,因为这种方法将被调用成千上万次(对于文本文档中的每个标记化单词)。所以它确实需要高效。
提前致谢!
答案 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)
代码:
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]。”);