[英]Find word in User Content without using .split() or StringTokenizer
我正在開發一個程序,要求用戶輸入一個短語和一個 integer。 integer 用於識別將從短語中返回的單詞。 例如,如果他們輸入 5,程序應該將句子中的第五個單詞返回給用戶。
System.out.println("Your word is: " +combineString(phrase,numWord));
這是我迄今為止的工作,主要是output,
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(第 4 個空格 +1,第 5 個空格)”。 這就是我卡住的地方,因為我不知道如何開始,以及如何到達第四空間。
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
}
這段代碼應該適合你。 如果是這種情況,請接受答案。
public static String combineString(String newPhrase, int newNum) {
try {
return newPhrase.split(" ")[newNum - 1];
} catch (ArrayIndexOutOfBoundsException e) {
return null;
}
}
如果你想 go 真的很低級,那么你可以 go 低於subString
並操作單個字符。 這樣很容易跳過空白以外的其他字符。 通過將正則表達式轉換為有限的 state 自動機,這也是朝着執行正則表達式的方式邁出的一步。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.