Как избежать исключения Array Out of Bound в Java - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь написать код на Java (часть задания mapreduce), чтобы проверить предложение для определенных ключевых слов, когда любое ключевое слово, найденное в предложении, должно проверять предложение за 2 слова до ключевого слова и / или до 3 слова после. если он находит совпадение, он что-то выводит.

Я пишу код для перебора 3 ArrayLists строк следующим образом:

1 - итерация по Arraylist1<String) и проверка if ArrayList1.get(i)= ArrayList2.get(j). если равно, переходите к 2 (ниже), в противном случае i++.

2 - перебирать ArraList3. Проверьте до 2 слов до ArraList1[i] и до 3 слов после ArrayList1[i]. Если в этом диапазоне он находит совпадение в пределах ArrayList3, он должен что-то вывести.

Теперь проблема заключается в выполнении условий 2 слов до и 3 слов после. Потому что необходимо учитывать множество условий в зависимости от размера предложения (т.е. размер ArrayList1).

Пример: если вы находитесь на 1-м или 2-м слове предложения, вам нужно проверить 3 слова только после И 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

1 Ответ

0 голосов
/ 15 января 2019

Самое главное - структурировать ваш код, имея 4 вложенных цикла, безумно. Попробуйте написать какую-нибудь функцию с хорошим описанием того, что они делают, и у вас не должно быть более двух циклов внутри друг друга.

На ваш вопрос, у вас есть if (tokensList.get(e), в то время как e установлен как int e = i - 2, и поскольку i изначально начинается как int i = 0, тогда вы можете проверить -2 или -1. То же самое касается верхней границы, у вас есть e < i + 4, что на +4 больше, чем размер вашего списка.

...