Как вы проверяете слова или фразы в строке и сравниваете их с массивом слов или фраз? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь подсчитать количество слов или фраз из входной строки, которая соответствует массиву слов или фраз.

У меня он несколько работает с методом содержимого, но он не считает слово или фразу, если он находится во входной строке более одного раза.

public int calculateSpamPoints(String email)
{
    int counter = 0;

    String[] spamWordsArray = new String[list.size()];

    spamWordsArray = this.list.toArray(spamWordsArray);

    String emailInput = "";

    if(email.contains("."))
    {
                emailInput = this.getFileContent(email).toLowerCase();
    }

    else
    {
        emailInput = email;
    }

    for (int i = 0; i <= spamWordsArray.length - 1; i++)
    {
    if(emailInput.toLowerCase().contains(spamWordsArray[i].toLowerCase()))
    {
        counter++;
    }
    }

        return counter;
}

Если кто-то вводит строкунапример,

Существует предложение без комиссий, обязательств и гарантии в миллион долларов.

Результат подсчета - 5. [Предложение, без комиссий, без обязательств, гарантии,миллион долларов]

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Работает только над вашим начальным утверждением ...

Я пытаюсь подсчитать количество слов или фраз из входной строки, которая соответствует массиву слов или фраз.

Кажется, вам просто нужно использовать java.util.regex.Pattern и java.util.regex.Matcher.По сути, ваш массив «слов и фраз» должен быть указан в виде шаблонов (Pattern).Затем эти шаблоны проходят через Matcher, который выполняет всю тяжелую работу.

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MatchStringsInQuote {

  private String [] eekWords = { "fear", "Little", "death", "gone", "Fear is the mind-killer"};

  private void searchQuote(String quote) {
      eekWords = Arrays.stream(eekWords).map(w -> w.toLowerCase()).toArray(String[]::new);
      quote = quote.toLowerCase();
      int counter = 0;
      for(int i = 0; i < eekWords.length; i++) {
          Pattern pattern = Pattern.compile(eekWords[i]);
          Matcher matcher = pattern.matcher(quote);
          while (matcher.find()) {
              counter ++;
              System.out.println(eekWords[i]);
          }
      }
      System.out.println("Found " + counter + " matches.");
  }

  public static void main(String [] args) {
      MatchStringsInQuote matchStringsInQuote = new MatchStringsInQuote();
      String Quote = "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.";
      matchStringsInQuote.searchQuote(Quote);
  }
}

Возможно, вы решите не преобразовывать все в нижний регистр, прежде чем пытаться сопоставить, вместо этого вы можете просто указать умное регулярное выражение как часть шаблона для сопоставления.

Здесьспецификация Java 8 для java.util.regex.Pattern

0 голосов
/ 24 сентября 2019

Метод contains() проверяет наличие слов в строке и возвращает true или false.Если вы хотите посчитать частоту определенного слова внутри строки, то вы можете использовать ArrayList вместо Array, который вы искали внутри, а затем с помощью метода частоты класса Collections вы можете посчитать частоту любых слов.

List<String> list = new ArrayList<>(); list.add("a");  list.add("a");   list.add("b");int count = Collections.frequency(list,"a");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...