数组列表存储和检查问题

时间:2014-08-04 11:24:27

标签: java arraylist

我目前正在开发一个程序,用一个单词找到第一个辅音。以下是主类的代码:

            consonantLoop = 0;
            while(!consonantFound) {
                currentLetter = characters.get(consonantLoop);
                for(int x = 0; x < consonants.size(); x++) {
                     if(currentLetter == consonants.get(x)) {
                         consonantFound = true;
                         System.out.println("The first constanent in the word is " + consonants.get(x).toString());
                     } else {
                         consonantLoop++;
                     }
                }
            }

我使用变量consonantLoop来识别我正在检查的单词的字母是否是元音。 consonantFound是一个布尔值,表示是否找到了第一个辅音。 currentLetter是一个字符,用于定义我当前正在检查的字母。 characters是存储我的角色的arraylist。 consonants是存储辅音的数组。但是,当我运行代码并且秒号是一个辅音时,它会给我这个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 42, Size: 3
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at testing.Main.main(Main.java:44)

第44行是currentLetter = characters.get(consonantLoop);
在@RajenRaiyare的帮助下,我已经能够编辑我的代码,所以我不会再有任何错误:

consonantLoop = 0;
while(!consonantFound) {
                try {
                    currentLetter = characters.get(consonantLoop);
                    for(int x = 0; x < consonants.size(); x++) {
                        if(currentLetter == consonants.get(x)) {
                            consonantFound = true;
                            System.out.println("The first consonant in the word is " + consonants.get(x).toString());
                        } else {
                            consonantLoop++;
                }
            }
        } catch(IndexOutOfBoundsException  e) {
            break;
        }
    }

然而现在输入单词后,程序才会终止。有什么问题?

3 个答案:

答案 0 :(得分:2)

目前你正在做的是你只是在增加constantLoop计数器但不检查它是否小于你从中获取记录的arraylist的大小。因此,如果constantLoop的值等于arraylist的大小,则意味着它将给出IndexOutOfBoundsException。

解决这个问题的两种方法

1

catch IndexOutOfBoundsException and do break from it.

2

if (constantLoop < characters.size()) {
currentLetter = characters.get(constantLoop);
}else{
break;
}

答案 1 :(得分:2)

您的代码有两个主要问题。首先,当你点击列表末尾时(或者在新版本中,你使用一种非常奇怪的方式),你不会停止。其次,您为每个辅音consonantLoop提升currentLetter一次。您只希望为currentLetter的每个值执行一次此操作。这样增量的最简单方法是使用for循环而不是while

for (int consonantLoop = 0; consonantLoop < characters.size() && !consonantFound;
        consonantLoop++) {
    ...
}

尽管使用循环计数器是不必要的复杂功能。 for-each循环是一种更简洁的迭代characters内容的方法。在我们处理它的同时,我们可以通过调用contains方法来替换笨重的内循环:

for (Character c : characters) {
    if (consonants.contains(c)) {
        System.out.println("First consonant: " + c);
        break;
    }
}

break结束循环,因为我们无法使用带有for-each循环的consonantFound标记。

答案 2 :(得分:0)

如果您在没有任何辅音的情况下得到一个字,那么您没有测试可以避免consonantLoop超出characters的大小。

你应该写你的循环:

while ((!consonantFound) && (consonantLoop < characters.length())) {
    ...
}