Проверьте окончания строки без встроенных методов, таких как endWith () в Java - PullRequest
0 голосов
/ 28 октября 2019

Я хочу проверить, имеет ли каждое слово в строке определенные окончания различной длины. Я не могу использовать массивы и методы для этого, как EndWith (). Единственные методы, которые мне разрешено использовать, это charAt () и length ().

public class TextAnalyse {
    public static void main(String[] args) {
        System.out.println(countEndings("This is a test", "t"));
        System.out.println(countEndings("Waren sollen rollen", "en"));
        System.out.println(countEndings("The ending is longer then every single word", "abcdefghijklmn"));
        System.out.println(countEndings("Today is a good day", "xyz"));
        System.out.println(countEndings("Thist is a test", "t"));
        System.out.println(countEndings("This is a test!", "t"));
        System.out.println(countEndings("Is this a test?", "t"));
    }

    public static int countEndings(String text, String ending) {
        int counter = 0;
        int counting;
        int lastStringChar;

        for (int i = 0; i < text.length(); i++) {
            lastStringChar = 0;
            if (!(text.charAt(i) >= 'A' && text.charAt(i) <= 'Z' || text.charAt(i) >= 'a' && text.charAt(i) <= 'z') || i == text.length() - 1) {
                if( i == text.length() - 1 ){
                    lastStringChar = 1;
                }
                counting = 0;
                for (int j = 0; j + lastStringChar < ending.length() && i > ending.length(); j++) {
                    if (text.charAt(i - ending.length() + j + lastStringChar) == ending.charAt(j)) {
                        counting = 1;
                    } else {
                        counting = 0;
                    }
                }
                counter += counting;
            }
        }

        return counter;
    }
}

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

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Полагаю, вы можете использовать регулярное выражение.

Если вы хотите считать слова с окончанием, вы можете использовать следующий код:

public static int countEndings(String text, String ending) {
    final Matcher wordWithEndMatches = Pattern.compile("\\b[A-Za-z]*" + ending + "\\b").matcher(text);
    int count = 0;
    while(wordWithEndMatches.find()) {
        count++;
    }
    return count;
}
0 голосов
/ 28 октября 2019

Самое простое решение, которое я могу придумать, состоит в следующем:

Проверьте, заканчивается ли слово заданным суффиксом:

public static boolean endsWith(String word, String suffix) {
  if(suffix.length() > word.length()) {
    return false;
  }
  int textIndex = (word.length() - 1);
  int suffixIndex = (suffix.length() - 1);
  while(suffixIndex >= 0) {
    char textChar = word.charAt(textIndex);
    char suffixChar = suffix.charAt(suffixIndex);
    if(textChar != suffixChar) {
      return false;
    }
    textIndex--;
    suffixIndex--;
  }
  return true;
}

Разделите данное в его словах ииспользуйте вышеуказанный метод для подсчета каждого слова, заканчивающегося данным окончанием:

public static int countEndings(String text, String ending) {
  {
    //maybe remove punctuation here...
    //(if yes, use String.replace for example)
  }
  String[] words = text.split(" ");
  int counter = 0;
  for(String word: words) {
    if(endsWith(word, ending)) {
      counter++;
    }
  }
  return counter;
}

Также рассмотрите возможность удаления нежелательной пунктуации, например '!'или же '?'(...) - приведенная выше реализация не распознает любое слово, заканчивающееся t в String test!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...