如何查找字符串中连续双字母(大写字母)的数量?

时间:2019-05-21 10:50:33

标签: java string

我必须查找字符串中连续大写字母的数量。 例如,“小兔子” 连续大写字母的数量= 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);
}

4 个答案:

答案 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);
}