【发布时间】: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 < Math.min( tokensList.size() - 1, i + 4); ...获得正确的边界。 -
List中有一些方法可以用来避免使用很多 for 循环,例如contains和indexOf。我建议你看看List documentation -
谢谢@Thomas。我现在就试一试。
-
ArrayList implements List因此List上的文档也适用于ArrayList。事实上,它应该适用于遵守合同的List的所有实现,如果任何实现在某种程度上有所不同,它应该清楚地说明(尽管这样的实现会导致很多问题,它们可能不存在故意) . -
是的,没错。在那个级别你必须使用
String方法
标签: java for-loop if-statement conditional-statements