我必须查找字符串中连续大写字母的数量。 例如,“小兔子” 连续大写字母的数量= 2(第一个是TT,第二个是BB) 程序无法运行。
程序给出如下错误消息
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围: 14
try {
String s = " LITTLE RABBIT";
s.toUpperCase();
int l = s.length();
int a = 0;
char ch1, ch2;
for (int i = 0; i < l; i++) {
ch1 = s.charAt(i);
ch2 = s.charAt(i + 1);
if (ch1 == ch2) {
a++;
}
}
System.out.println(a);
} catch (StringIndexOutOfBoundsException e) {
System.out.println(e);
}
答案 0 :(得分:1)
尝试使用以下代码。您必须从0遍历到String Size-1。但是要遍历没有元素的最后位置。这就是为什么您会收到StringIndexOutOfBounds异常的原因。
public static void main(String[] args) {
try {
String s = " LITTLE RABBIT";
s.trim().toUpperCase();
int l = (s.length() - 1);
int a = 0;
char ch1, ch2;
for (int i = 0; i < l; i++) {
ch1 = s.charAt(i);
ch2 = s.charAt(i + 1);
if (ch1 == ch2) {
a++;
}
}
System.out.println(a);
} catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
得到异常的原因很简单。在循环的最后一次运行中,您检查字符串的最后一个字符是否等于下一个字符。您的字符串没有其他字符,因此您遇到了异常。
为避免此问题,您必须减少循环并使用for (int i=0; i < l-1; i++)
。切记:字符串中的第一个字符的索引为0,最后一个字符的索引为l-1。在此设置中,您不必使用最后一个字符运行循环,因此可以在l-1之前停止
答案 2 :(得分:0)
首先,除非您只是在调试(甚至在调试...),否则您不应该抓住+--------+--------+
|value[0]|value[1]|
+--------+--------+
|One |Two |
|Three |Four |
+--------+--------+
。
第二,根本原因是您的循环中断变量设置正确,但是您可以通过在语句StringIndexoutOfBoundsException
1
任意递增来de污它。
第三,这是一个使用正则表达式的简单解决方案。
s.charAt(i+1);
给出...
static int findMaxConsecutiveCapitalizedLetters(String input) {
// TODO null/empty check
// TODO move the statement below to a constant somewhere
Pattern p = Pattern.compile("(\\p{Upper})\\1+");
Matcher m = p.matcher(input);
int counter = 0;
while (m.find()) {
if (m.group().length() > counter) {
counter = m.group().length();
}
}
return counter;
}
您将获得:
String[] test = {"LITTLE RABBIT", "BIG RAbbIT", "DEMON RABBBIT FROM HELL"};
Arrays.stream(test).forEach(
(s) -> System.out.println(findMaxConsecutiveCapitalizedLetters(s))
);
注意有关模式:
2 (because LITTLE and RABBIT have both 2)
0 (no repeated capitalized letters)
3 (RABBBIT has 3 here, HELL only 2 so it returns the biggest)
答案 3 :(得分:0)
您的问题是,您在遍历所有字符串的同时也调用了下一个字符。因此,到达最后一个字符时,您会遇到异常,因为您在最后一个字符之后调用了该字符。由于您正在寻找一种简单的解决方案,因此这里是固定代码。
try
{
String s = " LITTLE RABBIT";
s.toUpperCase();
int l = s.length();
int a =0;
char ch1, ch2;
//Remove one so you no longer call it. It fixes it since the last one can't be a pair.
for( int i =0; i < l-1; i++)
{
ch1 = s.charAt(i);
ch2 = s.charAt(i+1);
if( ch1 == ch2)
{
a++;
}
}
System.out.println(a);
}
catch(StringIndexOutOfBoundsException e)
{
System.out.println(e);
}