【问题标题】:How to avoid Array Out of Bound Exception in JavaJava中如何避免数组越界异常
【发布时间】:2019-06-09 17:55:06
【问题描述】:

我正在尝试用 Java 编写代码(mapreduce 工作的一部分)来检查句子中的某些关键字,当在句子中找到任何关键字时,它应该检查该句子在关键字之前最多 2 个单词和/或最多3个字之后。如果找到匹配项,它会输出一些东西。

我正在编写一个代码来遍历 3 个 ArrayLists 的字符串,如下所示:

1- 遍历Arraylist1<String) 并检查if ArrayList1.get(i)= ArrayList2.get(j)。如果等于,则继续执行 2(如下),否则为 i++

2- 遍历 ArraList3。在ArraList1[i] 之前最多检查 2 个字,ArrayList1[i] 之后最多检查 3 个字。如果在这个范围内它在ArrayList3 中找到匹配项,它应该输出一些东西。

现在的问题在于实现前2个词和后3个词的条件。因为它需要根据句子的大小(即ArrayList1的大小)来考虑很多条件。

示例:如果您在句子的第 1 个或第 2 个单词,您需要检查 3 个单词 after only 以及 1 个单词之前和 3 个单词之后(也取决于句子的大小)。

for (int i = 0; i < tokensList.size(); i++) {

  keywordsListLoop:

    for (int j = 0; j < keywordsList.size(); j++) {

      if (tokensList.get(i).startsWith(keywordsList.get(j)) == true)

        for (int e = i - 2; e < i + 4; e++) {
          boolean flag = false;
          // I think the rules need to go here
          for (int g = 0; g < posWordsList.size(); g++) {
            // or perhaps here :s
            if (tokensList.get(e).compareTo(posWordsList.get(g)) == 0) {

              word.set(keywordsList.get(j));
              context.write(word, one);
              flag = true;
              break; //breaks out of Inner loop (PosWords loop)
            }
          }

          if (flag)
            break; //breaks out of outter loop ( e loop) 
          break keywordsListLoop; //need to make sure this actually breaks out of keywords loop
        }
    }

  //now check next token

【问题讨论】:

  • 假设您的代码是正确的,并且由于唯一可能导致异常的调用是 tokensList.get(e),您可以通过 e = Math.max(0, i - 2); e &lt; Math.min( tokensList.size() - 1, i + 4); ... 获得正确的边界。
  • List 中有一些方法可以用来避免使用很多 for 循环,例如 containsindexOf。我建议你看看List documentation
  • 谢谢@Thomas。我现在就试一试。
  • ArrayList implements List 因此List 上的文档也适用于ArrayList。事实上,它应该适用于遵守合同的List 的所有实现,如果任何实现在某种程度上有所不同,它应该清楚地说明(尽管这样的实现会导致很多问题,它们可能不存在故意) .
  • 是的,没错。在那个级别你必须使用String 方法

标签: java for-loop if-statement conditional-statements


【解决方案1】:

最重要的是——构建你的代码,有 4 个嵌套循环是疯狂的。尝试编写一些函数,对它们正在做的事情进行一些很好的描述,并且彼此之间不要有超过 2 个循环。

对于您的问题,您有这个if (tokensList.get(e),而e 设置为int e = i - 2,并且因为i 最初以int i = 0 开头,那么您可以检查-2-1。上限也是如此,您的 e &lt; i + 4 +4 大于您的列表大小。

【讨论】:

  • 非常感谢您的回复。我实际上是 Java 新手,没有编写函数的经验。我知道问题是初始化,我能写的唯一解决方案是里面有很多 if 条件。基本上,我的问题是寻找更好的解决方法。
猜你喜欢
  • 2012-01-31
  • 2013-10-05
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多