我正在开发一个在HTML中输出词汇表术语和定义的程序,我想根据我正在检查的定义是否有关键字来改变输出。要做到这一点,我有一个ArrayList包含我正在寻找的所有关键字,我试图使用foreach循环,但它并没有真正正常工作。有一个更好的方法吗。有人能为我提供任何指示。我觉得不应该那么难。使用HTML位,我试图在关键字之前输出前导词(关键字应该是HREFED),然后继续通过关键字检查定义中的任何更多关键字。
按方式:checkValues是我的ArrayList,valueTwo是定义。
这是我到目前为止所做的:
for(String getTerm : checkValues){
String correct = getTerm + " ";
if (valueTwo.contains(correct)) {
int foundTermPosition = valueTwo.indexOf(correct);
lead = valueTwo.substring(0, foundTermPosition-1);
index = valueTwo.length() - lead.length();
leftOver = valueTwo.substring(foundTermPosition+correct.length(), valueTwo.length());
out.write(lead);
out.write("<A HREF=\"#" + correct + "\">" + correct + "</A>");
out.write(leftOver + "\n");
}
else
{
out.write(valueTwo);
}
}
答案 0 :(得分:1)
我无法对dreamcrash的帖子发表评论,因为我没有在评论中发帖,但我认为他的观点是避免像&#34; high&#34;,& #34; hip&#34;等被算作单词&#34; hi&#34;。这个空间会强制执行,对吗?我并不是说这是最好的方式,因为它可能会导致问题标点符号出现(例如&#34; hi,&#34;),但我认为这是他这样做的原因。如果我错了,请纠正我。
另外,回答这个问题。我相信indexOf也可以将起点作为传入的第二个值。您可以将最近找到的出现位置(foundTermPosition)设置为继续循环的起始值。所以......
ArrayList<Integer> foundTermPositions;
int startingPoint = 0;
while(valueTwo.indexOf(correct , startingPoint) != -1) {
foundTermPositions.add(valueTwo.indexOf(correct);
startingPoint = valueTwo.indexOf(correct, startingPoint) + correct.length();
}
对ArrayList中的每个项执行剩余的代码。
答案 1 :(得分:1)
编辑:解释之后你要做的是:
String valueTwoWords [] = valueTwo.split(" "); // if value = "I went"
// valueTwoWords = ["I","went"]
for(String getTerm : checkValues)
{
for(int i = 0; i < valueTwoWords.length(); i++)
{
if(valueTwoWords[i].compareTo(getTerm) == 0) // If the words are the same.
{
int foundTermPosition = valueTwo.indexOf(getTerm);
lead = valueTwo.substring(0, foundTermPosition-1);
index = valueTwo.length() - lead.length();
leftOver = valueTwo.substring(foundTermPosition+getTerm.length(), valueTwo.length());
out.write(lead);
out.write("<A HREF=\"#" + getTerm + "\">" + getTerm + "</A>");
out.write(leftOver + "\n");
i = valueTwoWords.length() + 1; // getting out of the cycle.
}
}
}
您不应该在字符串中添加黑色空格:
String correct = getTerm + " ";
尝试直接在字符串上进行比较:
if (valueTwo.contains(getTerm))
如果您有以下字符串:
String s1 = "hi";
String s2 = "hi";
String s3 = "hi ";
此s1.contains(s2));
将返回true
,但s1.contains(s3));
将返回false
。
如果您的目标是查看两个单词是否相同,则应使用方法compareTo
而不是方法包含。
<强>的compareTo 强>
public int compareTo(Object o)
将此String与另一个Object进行比较。如果Object是String, 此函数的行为类似于compareTo(String)。否则,它抛出一个 ClassCastException(因为Strings只能与其他字符串相媲美)。
请注意:
<强>返回:强>
如果参数是按字典顺序排列的字符串,则值0 等于
到此字符串;如果参数是a,则值小于0 字符串字典比此字符串更强;如果参数是字符串,字典小于,则大于0 。 (source)
因此string1
和string2
string1.compareTo(string2)
如果相等则会返回0。如果这是你想做的事情:
if (valueTwo.compareTo(getTerm) == 0)
最后,如果你只是检查valueTwo是否在ArrayList上,你可以使用
if(checkValues.contains(valueTwo))
// do something