超出范围的例外问题

问题描述 投票:1回答:3

任务是检查一个句子的每个单词中的数字,找到同时具有最大数字的单词POWER OF 3.我在这里做了所有事情并且它工作正常,直到我在句子中的最后一个单词以数字结尾

例如:

输入:Iam8 you64 asjkj125 asdjkj333 heis216:OutOfBounds

输入:Iam8 you64 asjkj125 asdjkj333 heis216s:heis216s是目标词

然后它会走出界限,我已经(至少我认为我)发现了哪里,但我不知道如何避免这种情况而不改变这个计算的想法。

以下是发生这种情况的代码:

for (int i = 0; i < r.length(); i++) {

    current+= r.charAt(i);
    if (r.charAt(i) == ' ' || i = r.length()-1) { 
        for (int j = 0; j < current.length(); j++) {
            while ((int) current.charAt(j) > 47 && (int) current.charAt(j) < 58) {

//如果最后一个单词的最后一个字符是一个数字,j递增,我们最终超出界限。

                        br = br + current.charAt(j);
                   j++;
                }

Complete code

java loops indexoutofboundsexception
3个回答
1
投票

即使在最后一个字符串处理后,current仍在处理中,因此会发生StringIndexOutOfBoundsException异常。因为正在处理current字符串,所以j的检查应该是current的长度。像j < current.length()一样在while循环中添加while ( j<current.length() && (int) current.charAt(j) > 47 && (int) current.charAt(j) < 58)的检查。


0
投票

使用split方法获取此句子的标记。

对于每个令牌,从ascci数字的索引开始,直到令牌的长度,将存储在映射中的数字作为值和字符部分作为键。

然后处理map的值以获得3的幂,然后得到它的键值并相应地返回单词。


0
投票

while(j <current.length()&&(int)current.charAt(j)> 47 &&(int)current.charAt(j)<58){br + = current.charAt(j); J ++; }

我只更改了这个,并且不再看到OutOfRange异常了。如果我理解你的任务正确,代码看起来很复杂,你使用String进行计算,这是无效的。看看这种方法:

public static void main(String[] args) {
    String v = "Iam8 you64 asjkj125 asdjkj333 heis216s";
    int sum = 0, max = 0, start = 0;
    StringBuilder maxWord = new StringBuilder();
    for (int i = 0; i < v.length(); ++i) {
        char ch = v.charAt(i);
        if (Character.isWhitespace(ch)) {
            max = updateMax(v, maxWord, max, sum, start, i);
            start = i + 1;
            sum = 0;
        } else if (Character.isDigit(ch)) {
            sum += ch - 48;
        }
    }
    if (sum > 0) {
        updateMax(v, maxWord, max, sum, start, v.length());
    }
    System.out.println(maxWord.toString());
}

private static int updateMax(String v, StringBuilder maxWord, int max, int sum, int start, int i) {
    if (sum >= max && isPowerOfThree(sum)) {
        maxWord.replace(0, maxWord.length(), v.substring(start, i));
        return sum;
    }
    return max;
}

private static boolean isPowerOfThree(int sum) {
    // see any from https://stackoverflow.com/questions/1804311/how-to-check-if-an-integer-is-a-power-of-3
    while (sum % 3 == 0) {
        sum /= 3;
    }
    return sum == 1;
}

此外,如果您需要最后一个适当的单词,那么从输入字符串的结尾开始会更有效。

© www.soinside.com 2019 - 2024. All rights reserved.