2012-12-03 1 views
1

Я работал над программой, которая выводила термины и определения глоссария в HTML, и я хочу изменить вывод на основе того, имеет ли определение, которое я проверяю, ключевое слово. Для этого у меня есть ArrayList, в котором хранятся все ключевые слова, которые я ищу, и я пытался использовать цикл foreach, но на самом деле он не работал правильно. Есть лучший способ сделать это. Может ли кто-нибудь предложить мне какие-либо указания с этим. Я чувствую, что этого не должно быть. С битом HTML я пытаюсь вывести ведущие слова перед ключевым словом (ключевое слово должно быть HREFED), а затем продолжить проверку ключевых слов для любых других ключевых слов в определении.Проверка того, содержит ли String одно из слов в ArrayList

BY THE WAY: 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); 

       } 

     } 

ответ

1

EDIT: После вашего объяснения, что вам нужно сделать, это:

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) 

Сравнивает эту строку на другой объект. Если объект является строкой, эта функция ведет себя как compareTo (String). В противном случае он выдает ClassCastException (поскольку строки сопоставимы только с другими строками).

обратите внимание, что:

Возвращает:

значение , если аргумент является строка лексически равной для этой строки; значение меньше 0, если аргумент строка лексикографически больше, чем эта строка; и значение больше 0, если аргумент представляет собой строку , лексикографически менее, чем эта строка. (source)

Так string1 и string2string1.compareTo(string2) возвращает 0, если равны. Если это то, что вы хотите, чем сделать:

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

Наконец, если вы возражаете просто проверить, если valueTwo находится на ArrayList один раз, вы можете использовать

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

Я не могу комментировать пост dreamcrash, потому что у меня нет респ размещать в комментариях, но я думаю, что его точка будет избегать слов, как «высокий», «бедро» и т. д. считаются словом «привет». Пространство обеспечит это, не так ли? Я не говорю, что это лучший способ, потому что это может привести к тому, что на изображении появляются знаки пунктуации (например, «привет»), но я думаю, что это было его причиной для этого. Пожалуйста, исправьте меня, если я ошибаюсь.

Кроме того, чтобы ответить на вопрос. Я считаю, что 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.

+0

ЭТО ПРАВИЛЬНО! – Tastybrownies