簡體   English   中英

在 Java 中檢查沒有內置方法(如 endsWith())的字符串的結尾

[英]Check endings of an String without built-in methods like endsWith() in Java

我想檢查字符串中的每個單詞是否都有不同長度的特定結尾。 我不能使用 arrays 和類似endsWith() 的方法。 我允許使用的唯一方法是 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;
    }
}

實際結果是我少了一個,我猜是因為它沒有正確檢查最后一個字符。

我能想到的最簡單的解決方案如下:

檢查一個單詞是否以給定的后綴結尾:

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;
}

還要考慮刪除不需要的標點符號,例如“?” 或者 '。' (...) - 上面的實現將無法識別String測試中任何以t結尾的單詞test!

我猜你可以使用正則表達式。

如果要計算帶結尾的單詞,可以使用以下代碼:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM