1

我正在开发一个以 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);

              }

       }
4

2 回答 2

1

我不能对 dreamcrash 的帖子发表评论,因为我没有代表在评论中发帖,但我认为他的观点是避免将“high”、“hip”等词视为“hi”这个词。空间会强制执行这一点,对吗?我并不是说这是最好的方法,因为它可能会导致标点符号出现问题(例如“hi”),但我认为这是他这样做的原因。如果我错了,请纠正我。

另外,回答问题。我相信 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 中的每个项目执行其余代码。

于 2012-12-03T21:07:26.460 回答
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));将返回trues1.contains(s3));会返回false

如果您的目标是查看两个单词是否相同,您应该使用方法compareTo而不是方法包含。

相比于

public int compareTo(Object o)

将此字符串与另一个对象进行比较。如果 Object 是 String,则此函数的行为类似于 compareTo(String)。否则,它会抛出 ClassCastException(因为字符串只能与其他字符串相比较)。

注意:

回报:

如果参数是按字典顺序等于该字符串的字符串,则值为 0;如果参数是按 字典顺序大于此字符串的字符串,则值小于 0 ;如果参数是按字典顺序小于此字符串的字符串,则值大于 0 。来源

因此,如果相等,则forstring1和将返回 0。string2 string1.compareTo(string2)如果这是您想要的而不是做:

if (valueTwo.compareTo(getTerm) == 0)

最后,如果您的对象只是检查 valueTwo 是否在 ArrayList 上一次,您可以使用

if(checkValues.contains(valueTwo))
// do something
于 2012-12-04T01:10:06.513 回答