检查String是否包含ArrayList中的一个单词

时间:2012-12-03 20:41:52

标签: java string algorithm arraylist contains

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

              }

       }

2 个答案:

答案 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

因此string1string2 string1.compareTo(string2)如果相等则会返回0。如果这是你想做的事情:

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

最后,如果你只是检查valueTwo是否在ArrayList上,你可以使用

if(checkValues.contains(valueTwo))
// do something