Найти слово в пользовательском контенте без использования .split () или StringTokenizer - PullRequest
1 голос
/ 25 октября 2019

Я работаю над программой, которая просит пользователя ввести фразу и целое число. Целое число используется для определения того, какое слово будет возвращено из фразы. Например, если они введут 5, программа должна вернуть пользователю пятое слово в предложении.

System.out.println("Your word is: " +combineString(phrase,numWord));

Это моя работа до сих пор, есть основной вывод,

public static String combineString(String newPhrase, int newNum) {
  int countWords = 0;
  String word = "";

  //words count. I'll +1 everytime using countWord the match the amount of words
  for(int i=0; i< newPhrase.length(); i++) {
     if(newPhrase.charAt(i) == ' ') {
        countWords++;             
     }
  }  

  //return the last word. Ex: 15 words in a phrase if user pick the 18th word it will return the 15th word.
  if(countWords+1 < newNum  || countWords+1 <= newNum) {
     word += newPhrase.substring(newPhrase.lastIndexOf(' ')+1, newPhrase.length()-1);
  }
  else if(newNum <=0) { //return null if the user pick 0 or less than 0
     word += null;   
  }           
  return word;

И я много думал о том, как работать над средней частью, и мои мыслиесли пользователь выберет numWord = 5, то для того, чтобы вернуть пятое слово в этом предложении, мне нужно будет использовать «newPhrase.substring (пробел 4th +1, пробел 5th)». И вот где я застрял, потому что я не знаю, с чего начать и как попасть в космос 4-го.

Ответы [ 2 ]

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

Если вы хотите перейти на действительно низкий уровень, тогда вы можете опуститься ниже subString и работать с одиночными символами. Таким образом, легко пропустить другие символы, кроме пустых. Это также шаг к выполнению регулярного выражения путем преобразования их в конечные автоматы.

enum ScanState {WHITESPACE, WORD}

private final static Set<Character> whitespace = new HashSet<>(Arrays.asList('"', ',', '.', '?', '!', '-', ';', ' '));

@Test
public void testTokenize() {
    char[] text = "No, it's been \"yes?\", and not \"no!\" - hasn't it?".toCharArray();
    List<String> expected = Arrays.asList("No", "it's", "been", "yes", "and", "not", "no", "hasn't", "it");
    assertEquals(expected, tokenize(text));
}

private List<String> tokenize(char[] text) {
    List<String> result = new ArrayList<String>();
    char[] word = new char[256];
    int maxLetter = 0;
    ScanState prevState = ScanState.WHITESPACE;

    for (char currentChar : text) {
        ScanState currState = whitespace.contains(currentChar) ? ScanState.WHITESPACE : ScanState.WORD;

        if (prevState == ScanState.WORD && currState == ScanState.WORD) {
            word[maxLetter++] = currentChar;
        }
        if (prevState == ScanState.WORD && currState == ScanState.WHITESPACE) {
            word[maxLetter++] = currentChar;
            result.add(String.valueOf(word, 0, maxLetter - 1));
        }
        if (prevState == ScanState.WHITESPACE && currState == ScanState.WORD) {
            maxLetter = 0;
            word[maxLetter++] = currentChar;
        }
        prevState = currState;
    }
    return result;
}
0 голосов
/ 25 октября 2019
public static String combineString(String newPhrase, int newNum) {
     if(newNum<=0)
        return null;
     String word = "";
     String [] match = new String[newNum];

    int j =0;
    for(int i=0; i< newPhrase.length(); i++) {
        word = word + newPhrase.charAt(i);
        if(newPhrase.charAt(i) == ' ') { 
           match[j] = word;
           if(j+1 == newNum) {
              return word; // returns the specified word
           } 
           j++;
           word = "";    
       }
    } 
    return word; //returns last word
  }

Этот код должен работать для вас. Если это так, примите ответ.

...